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();
其实就是根据判断调用不同的方法而已
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)
// ....
}
$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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28