【问题标题】:Symfony, getters and setters vs magic methodsSymfony、getter 和 setter 与魔术方法
【发布时间】:2017-08-26 05:01:10
【问题描述】:

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

不管怎样,你觉得用魔法方法替换 getter/setter 怎么样?会不会对表演造成太大的惩罚?还有其他我没有考虑到的问题吗?

【问题讨论】:

  • Getters 和 Setters 允许你控制你的对象 API。你可能需要一个setContainer,它只接受一个ContainerInterface 对象作为参数,而使用魔法设置方法很难做到这一点。此外,它还允许您轻松添加或更改特定 getter/setter 的行为

标签: php symfony magic-methods


【解决方案1】:

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

【讨论】:

  • 我同意这一点,这有时是一项愚蠢的任务,但你也对你的吸气剂和沙发多加了一些心思。有时您甚至会发现您不需要它们,因为某些属性只是没有从外部使用。大多数现代 IDE 对创建这些方法都有很好的支持。
  • 在 phpstorm 中重构之类的东西也不起作用,因为 setter 和 getter 只存在虚拟
  • 代码完成可以很好地与类文档块中的@property 之类的标签一起使用(主要 IDE 支持它)
【解决方案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。它也几乎回答了你的问题。

【讨论】:

    【解决方案3】:

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

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

    documentation 中所述。

    因此您只需要指定字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 2011-10-22
      • 2011-04-14
      • 2017-09-09
      • 1970-01-01
      • 2017-08-26
      相关资源
      最近更新 更多