原则 2 访问属性的推荐方法是什么?

2022-08-31 00:38:37

我记得在学说2模型中读到过,我不应该将属性/字段设置为公共。那么,您将如何公开这些字段呢?使用的沙箱和方法。这是最好的主意吗?它非常麻烦。使用魔术方法会让类似设置字段的事情公开吗?get*()set*()__get()__set()

您的建议是什么?


答案 1

这就是您不能使用公共属性的原因:公共字段如何在学说 2 中“破坏延迟加载”?

您是正确的,并且可以更轻松地访问 /字段。__get()__set()protectedprivate

下面是一个简单的示例:

public function __get($name)
{
  if(property_exists($this, $name)){
    return $this->$name;
  }
}

当然,这可以访问所有属性。您可以将其放在所有实体都扩展的类中,然后将不可评估的字段定义为 。或者,您可以使用数组来确定哪些属性应可访问:private$this->accessable = array('name', 'age')

有很多方法可以保护所有属性,并且仍然有一种相当简单的方法来获取/设置它们。


答案 2

就个人而言,我不喜欢具有微不足道目的的样板代码 - 它使代码变得丑陋且难以阅读。因此,我非常喜欢 /。也就是说,它们确实有一些缺点:__get__set

  • 它们比正常的函数调用慢得多,尽管在实践中并没有太大的影响,因为数据库访问要慢几个数量级。
  • __get/__set仅当字段不可见时才被调用;如果访问实体类代码中的属性,则不会调用它们,并且代理没有机会加载自身。(Doctrine试图通过在调用代理的公共方法之一后立即加载代理来避免这种情况,但是有一些例外情况,例如或没有意义的地方,因此您可以通过例如读取构造函数中的字段来遇到麻烦。__construct__wake
  • PHP有一些与魔术方法相关的令人困惑的行为 - 例如 不会调用(因此如果使用,它将中断代理行为)empty($entity->field)__get

推荐