使用__call()而不是getter和setter是否正确?

时间:2014-08-14 17:08:33

标签: php

关于良好实践的主题,将__call()用于需要getter和setter属于其属性的类是否正确?

查看Doctrine Entity的示例: https://gist.github.com/devmatheus/10668172#file-sessao1-php

我知道性能会受到影响,但这会缩短编程时间,你怎么看?

1 个答案:

答案 0 :(得分:2)

正如你所说,性能会降低,但更好的设计总能胜过性能。具有更多Ram和CPU的服务器并不像开发人员那么昂贵。

如果您需要动态调用的方法,我认为这是一个好点。 ,但是,它应该通过PHP Doc进行详细记录(它有助于IDE完成代码完成,开发人员不需要1小时才能理解)。只有在您无法使用此PHP文档记录它时才会出现这种情况(方法名是什么?返回类型是什么?)

/*
 * @method myReturnType $myMethodName
 * @property myReturnType $myPropertyName
 */
class Foo {}

如果可以静态创建方法,则应该这样做。

你的要点是谈论通过__call自动创建的getter和setter,没有额外的逻辑。 getter和setter的好处是,你可以在设置或获取之前使用该值。在这种情况下,你不能。所以我会考虑这个糟糕的设计。如果您将字段设为公共字段而不是受保护字段,则会产生相同的结果。


旁注:像PHP Storm这样的IDE可以为您自动创建Setter和Getter,如果您的wrting protected $_foo;(在这种情况下简单按{{1}在场上。

结果:

ALT+ENTER

如果您通过PHP文档或直接分配(protected $_foo; /** * @return mixed */ public function getFoo() { return $this->_foo; } /** * @param mixed $foo */ public function setFoo($foo) { $this->_foo = $foo; } )定义类型,则生成的PHP Doc甚至会写protected $foo = true@param bool $foo而不是@return bool