4

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

无论如何,您如何看待用魔术方法替换 getter/setter?会不会对表演造成太大的惩罚?还有其他我没有考虑的问题吗?

4

3 回答 3

2

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

于 2013-08-13T15:39:31.873 回答
2

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

我知道学说在它的实体管理器中也使用了魔法方法。因此,当您对对象进行存储库查询时,您可以使用:

 $repository->findOneByProperty($value);

代替

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

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

还请务必查看此答案。它也几乎回答了你的问题。

于 2013-08-13T17:55:09.690 回答
1

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

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

文档中所述。

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

于 2013-08-14T02:42:25.423 回答