Zend Framework、ThinkPHP中连贯操作的实现
Zend Framework、ThinkPHP中常常见到如下形式的代码: br / $User-where(id=1)-field(id,name,email)-find(); br / $this-view-baseUrl br / 这样的操作是不是很酷,操作也比较直观方便。下面就来研究下: br / br
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方法那肯定也是可以的撒。
既然知道了为什么可以这样,那么就来看看实例吧!
$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; }
- 上一篇:php逗号分割字符串的两种方法
- 下一篇:无数据库支持的留言板
精彩图集
精彩文章