什么是连贯接口?经常用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也同样能实现自动提示。


