Symfony,getter和setter vs magic方法

时间:2013-08-13 15:13:59

标签: php symfony magic-methods

我不喜欢为我的实体类中的每个属性设置“愚蠢”的getter和setter所以我正在考虑使用魔术方法获取/设置这些属性,而不是创建每个getter和setter。这个想法是当它的逻辑与典型的“return $ name”或“$ this-> name = $ name”不同时创建一个特定的getter或setter。此外,这个神奇的方法将在不同的类上创建,每个实体都会扩展它(我对这一步没有太多考虑)

无论如何,你怎么看待用魔术方法替换吸气剂/孵化器?会不会对表现造成太大的惩罚?我没有考虑到的任何其他问题?

3 个答案:

答案 0 :(得分:2)

IDE中的代码完成在这种情况下不起作用。 此外,您将无法对对象和数组进行类型提示,也无法对doc块进行类型提示。 性能会比较慢,但根据您的项目(服务器硬件和使用次数),您可能看不到任何差异

答案 1 :(得分:2)

问题在于,例如symfony2 twig的默认模板引擎需要这些方法。 Twig将语句{{ object.property }}转换为$object->getProperty(),因此您不必使用非常好的点表示法来调用twig中的属性,如下所示:{{ object.__get("property") }}

我知道它的实体经理doctrine also uses magic methods。因此,当您为对象创建存储库查询时,您可以使用:

 $repository->findOneByProperty($value);

而不是

$repository->findOneBy(array(
    'property' => $value
));

我强烈建议您不要使用魔术方法,而是分别对每个属性使用getset方法。这也可以让您更好地控制该属性的状态。

另请务必结帐this Answer。它几乎可以回答你的问题。

答案 2 :(得分:1)

如果您指的是Doctrine Entity并且您没有反对代码生成,则可以使用doctrine:generate:entities命令,例如:

$ php app/console doctrine:generate:entities Acme/StoreBundle/Entity/Product

documentation中所述。

因此,您只需要指定字段。