什么是连贯接口?经常用jQuery的朋友一定对下面的代码非常熟悉:
$('div').find('element').hide();
像上面这样,在一个方法后直接调用另一个同级方法,我们习惯上称其连贯接口。
连贯接口有什么好处呢?拿我们常用的工厂模式来举例:
$sql= new Joy_Db_SqlBuilder();
$sql->select();
$sql->table('test');
$sql->where('id' , '=' , '1');
换成连贯接口来实现的代码会是怎样呢?
$sql= new Joy_Db_SqlBuilder();
$sql->select()
->table('test')
->where('id' , '=' , '1');
可以看到在上面的代码中,相对以往的工厂模式的写法,使用连贯接口能稍微节省一些代码量,并且,代码逻辑性也更强。
如何实现连贯接口呢?这里我引用JoyPHP中的一段代码
class Joy_Db_SqlBuilder {
/**
* select方法
*
* @return Joy_Db_SqlBuilder
*/
public function select() {
$this->_args = array('method'=>'select');
return $this;
}
/**
* 定义所用的表名
*
* @param string $name
* @param string $alias
* @return Joy_Db_SqlBuilder|string
*/
public function table() {
// @todo something
// 返回this,实现连贯接口
return $this;
}
}
从代码中可以看到,每个方法都返回了$this,而$this表示的正式Joy_Db_SqlBuilder的实例,因此才可以继续调用其方法。
连贯接口很简单,写起来也很美,但是却遇到一个棘手的问题,类似ZendStudio,Eclipse之类的IDE似乎并不支持连贯接口的自动提示?其实结局的方法也很简单,只要像上面的代码注释那样,遵循PHPDoc的代码注释规范,在@return后注明返回的对象类型,这些IDE也同样能实现自动提示。
