主义2是推荐的访问属性的方式?

Jie*_*eng 16 php getter-setter doctrine-orm

我记得在Doctrine 2模型中读到它,我不应该公开属性/字段.你怎么会暴露这些领域?使用的沙箱get*()set*()方法.这是最好的主意吗?它非常麻烦.使用魔术方法__get() __set()会使设置字段公开类似吗?

你的推荐是什么?

Tim*_*tle 12

这就是为什么你不能使用公共属性:公共字段如何在Doctrine 2中"破解延迟加载"?

你是对的__get(),__set()可以更容易地访问protected/ private字段.

这是一个简单的例子:

public function __get($name)
{
  if(property_exists($this, $name)){
    return $this->$name;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我建议不要在你的实体中使用__get和__set,因为你懒得自己写.有些情况下使用魔术方法可能有意义,但这取决于实体的目的.大多数IDE都可以为您生成它们. (9认同)
  • @Cobby官方doctrine2文档声明:`...因此,我们敦促您只在实体上映射私有和受保护的属性,并使用getter方法或magic __get()来访问它们.http://www.doctrine-project.org/文档/ ORM/2.0/EN /参考/最佳practices.html (6认同)
  • @Cobby你有没有听说过继承?我仍然看不出为什么在BaseEntity类中编写数百行代码而不是写20行代码更好(自动或不自动)的原因. (3认同)
  • 您不必编写代码,IDE会生成代码.否则大约需要3分钟自行输入. (2认同)

Tgr*_*Tgr 9

就个人而言,我不喜欢具有琐碎目的的样板代码 - 这使得代码难以阅读并且令人厌烦.因此,我非常喜欢__get/ __set.也就是说,他们确实有一些缺点:

  • 它们比正常的函数调用得多,但并不是说它应该在实践中有所作为,因为数据库访问要慢几个数量级
  • __get/ __set只在字段不可见时才被调用; 如果您访问实体类的代码中的属性,则不会调用它们,并且代理也无法加载自身.(Doctrine试图通过在调用其中一个公共方法时立即加载代理来避免这种情况,但是有一些例外情况,例如__construct__wake哪些情况没有意义,所以你可能会遇到麻烦,例如阅读构造函数).
  • PHP有一些与魔术方法相关的令人困惑的行为 - 例如empty($entity->field)不会调用__get(因此如果使用它会破坏代理行为)

  • BTW:`empty($ entity-> field)`将调用魔术方法`__isset()` - 这是文档中的预期用途 (2认同)

xPh*_*eRe 6

如果某些信息应公开,请为其定义一个getter.如果它是可修改的,添加一个setter(更好的是,添加一个流畅的setter!).

API以这种方式更清洁,没有任何魔力.我的代码中不喜欢魔法.

只是我的两分钱:)


通过"流畅的setter"我的意思是实现流畅的界面模式.

  • 所以基本上是一个结束`return $ this的setter;`所以你可以做类似jQuery的链接:`$ object-> setName('name') - > setCode('code');`.好主意.将它添加到`orm:generate-entities`工具制作的setter中会很好. (2认同)