+ -
当前位置:首页 → 问答吧 → ThinkPHP连贯操作的实现

ThinkPHP连贯操作的实现

时间:2010-01-15

来源:互联网

主要是使用__call函数来实现的, 下面是示例
ThinkPHP中
$User->where('id=1')->field('id,name,email')->find();
这样的操作是不是很酷
呵呵, 今天就来研究一下ThinkPHP中的这些方法(其实他里面就没有这些方法是使用__call这个特殊的函数来实现的, 请看下面)
新人献丑, 别扔鸡蛋砸我哦..

先研究下, 为什么能
$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']}\" : '';
//.........更多处理
    echo $sql;
}

这里只是简单的讲解一下, 和官方可能有点出入.
在ThinkPHP里, 很帅的方法基本上都在__call函数中实现的比如有topN(), byXXX();
其实就是根据判断调用不同的方法而已 主要是使用__call函数来实现的, 下面是示例
ThinkPHP中
$User->where('id=1')->field('id,name,email')->find();
这样的操作是不是很酷
呵呵, 今天就来研究一下ThinkPHP中的这些方法(其实他里面就没有这些方法是使用__call这个特殊的函数来实现的, 请看下面)
新人献丑, 别扔鸡蛋砸我哦..

先研究下, 为什么能
$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']}\" : '';
//.........更多处理
echo $sql;
}

这里只是简单的讲解一下, 和官方可能有点出入.
在ThinkPHP里, 很帅的方法基本上都在__call函数中实现的比如有topN(), byXXX();
其实就是根据判断调用不同的方法而已

作者: xiaokai   发布时间: 2010-01-15

呵呵!谢谢了。。。的确是那个原理。。

作者: lhw105   发布时间: 2010-01-15

得好好研究研究了~~
楼主辛苦~~

作者: killr   发布时间: 2010-01-15

function __call($func,$args){
         // ....
}
$args 是个数组啊,那$test->form('test');  相当于 $test->options['form'] = 'test'; 应该不对啊··
$this->options[$func] = $args;  结果应该是 Array(from=>Array(0=>test))
如果 $test->options['form'] = args[0];
这样才是 Array(from=>test)

作者: mylanglang   发布时间: 2010-01-25

顶气下!

作者: vanvista   发布时间: 2010-01-25