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