Zend Framework、ThinkPHP中连贯操作的实现

字体大小: 中小 标准 ->行高大小: 标准

Zend Framework、ThinkPHP中常常见到如下形式的代码: 
$User->where('id=1')->field('id,name,email')->find(); 
$this->view->baseUrl 
这样的操作是不是很酷,操作也比较直观方便。下面就来研究下: 

先研究下,为什么能 
$User->where('id=1')->field('id,name,email')->find(); 

这样调用呢? 因为wher,field方法都返回的是$User啊.其实就是这样 
public function where($where) 
{ 
return $this; 
} 
public function field($field) 
{ 
return $this; 
} 
这样不就返回了对象自己吗? 
既然都返回了对象自己,那么调用field方法那肯定也是可以的撒。 

既然知道了为什么可以这样,那么就来看看实例吧! 

<?php
class Test
{
 protected $options = array();
 
 //这里就是了, 通过判断调用的函数名, 如果存在, 那么设置参数, 返回自己
 public function __call($func, $args)
 {
  if (in_array($func, array(
   'form',
   'field',
   'join',
   'order',
   'where',
   'limit',
   '更多....'
  )))
  {
   $this->options[$func] = $args;
   return $this; //这里返回了本对象
  }
 }
}
$test = new Test();
$test->form('test'); // 这样调用就相当于设置 $test->options['form'] = 'test';
//在ThinkPHP中这种连贯操作都是以find或者findAll结尾的.
//所以前面这些方法的调用只是在设置查询的参数而已
//在find或者findAll方法中, 是根据$this->options参数的不同执行不同的SQL
//比如这样
public function find() {
$sql = \"SELECT {$this->options['field']} FROM {$this->options['form']}\";
$sql .= isset($this->options['where']) ? \" WHERE {$this->options['where']}\" : '';
// More 
echo $sql;
}

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/29922.html