链式调用是一种只针对面向对象编程的一种思想。一般常用于JavaScrip、PHP等面向对象语言中。
通过链式调用,你可以快速的为实例化的对象进行属性的设置。

假如在PHP中,你需要查询一下数据库MySQL中db字段里host为localhost的记录,假如我们已经定义好勒一个DB类,并且实例化了一个$db,那么选择数据库MySQL,执行一次$db->setDB(“MySQL”);然后选择host表,$db->select(“db”);再选择条件,$db->where(array(“host”=>”localhost”));最后执行查询,$db->query()。

可以看到,我们需要分别执行$db中的四个不同的方法,去完成一次查询。有人可能会说我有猫饼?一个select * from db where name=’localhost’不就好了,为啥要分成四个方法。我也觉得我居然写这种技术博要用手机打字,说句题外话,真的,没有一家手机输入法软件公司的手机键盘是为程序员着想的,虽然这玩意就是程序员开发的,可能是为了报复社会吧。

好了回到正题上,其实早在很早以前我就有想过,为啥不直接用一个select方法,里面传table, field, where这些字段就好了。然而真的在使用的时候,你会发现,不仅仅方法的实现写的仿佛是打了补丁的牛仔裤,而且很简单的实现逻辑看上去非常的混乱。
原因很简单,你很难保证你不会反复的使用point运算符去连接字符构造查询语句,而且,你很难保证,你传递的参数看上去很优雅(不多也不长)。

而且可能一个select还好,insert,delete,update什么的一上去,整个调用时候,懵逼,哪个参数该传递哪个,完全一头雾水。可能用上面的思路一周前封装的db方法,一周后你就发现,不看源码没法直接调用使用。

所以,为了逻辑,一个查询语句可能会被分成多次执行。可以参考一下thinkPHP。

回归正题,你可能会看到有些框架的查询语句很优雅,行如这样:$db->setDB(“MySQL”)->select(“db”)->where(array(“host”=>”localhost”))->query();像这种你一看就哇,这逻辑,这书写贼清楚,简直看着赏心悦目,用着就爽死到爆的感觉有没有。

没错,这就是链式调用。

链式调用的实现非常简单,只需要在类的方法中return $this即可。之所以这样,想必原因也是非常清楚的。
每次调用的时候,从右至左依次运算,每次运算完了返回当前实例对象。

示例代码

<?php
class animal{
private $category;
private $color;
public function setCategory($param){
	$this->category = $param
	return $this;
}
public function setColor($param){
	$this->color = $param;
	return $this;
}
}

$pet = new animal();
$pet->setCategory("cat")->setColor("white"); //将宠物的种类设置为猫,颜色白色
?>