`return $ this;`设计模式还是反模式?

Lai*_*jus 13 php oop design-patterns anti-patterns

我已经多次看到使用return $this; 模式样式的Zend Framework - 从我的观点来看:

  • Pro:对于在同一个对象上链接许多操作并使代码更短,似乎是非常糟糕的模式样式.

  • Con:当你看到该对象在方法中返回自己时,代码看起来有点奇怪,这会做其他事情(例如某些属性的setter)

它是真正好的模式实践还是反模式实践?

编辑:好吧,从我这边说它有点太多了"模式",感谢大家指点我正确的方向!

Kar*_*ták 10

返回this允许您链接调用和设置值.它对于配置某个对象非常有用(请参阅Fluent界面).您可以非常轻松地表达您想要的内容(并且您可以使用不同的返回类型来实现您想要的效果).


Nic*_*ick 7

我发现方法链在有意义的情况下很有用; 特定于域的语言,例如:

$query->select('*')->from('users')->where(array('user_id' => 1, 'verified' => 1));
Run Code Online (Sandbox Code Playgroud)

问题是,这些方法只会返回void,所以它return $this只是作为写作的简写版本:

$query->select('*'); $query->from('users'); $query->where(...);
Run Code Online (Sandbox Code Playgroud)

我们仍然会调用toSQL()或者execute()方法来使用我们填充对象的数据.

在我看来,它不是一种反模式,可以在适当的情况下作为一种合法的,合理的对象种群方法.


Dav*_*May 7

如果你的意思是"良好做法或不良做法",这是我的看法:

从好的方面来说,你会得到一些语法糖.

在不利方面,您放弃有意义的返回值以支持可链接性.这是不可行的,因为最终你必须拥有返回基本对象以外的东西的方法,所以最终会得到一些可链接的方法和一些不可链接的方法(类的用户可以有趣地猜测哪些是哪一个.)

或者你全力以赴,无论如何都可以将它们全部链接起来,但是你会发现自己处于荒谬的境地,例如为了保留链条而返回一个虚假的"空"对象,这个对象需要进行一些模糊属性的测试确定它是"真实的"还是链中的链接.

经典的例子是jQuery,它展示了所有的症状:基础对象试图成为整个代码中唯一的基本数据单元(一切都返回一个jQuery对象); 假对象测试(if (obj.length)); 再加上自相矛盾,它仍然需要打破getAttribute()返回字符串等方法的可链接性.

恕我直言,只是为了那些语法糖而制造东西是一件非常糟糕的事情.