16

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

你的建议是什么?

4

6 回答 6

12

这就是为什么你不能使用公共属性的原因:公共字段如何在 Doctrine 2 中“打破延迟加载”?

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

这是一个简单的例子:

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

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

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

于 2010-12-16T19:21:07.500 回答
9

就个人而言,我不喜欢具有琐碎目的的样板代码 - 它使代码变得丑陋且难以阅读。因此,我强烈喜欢__get/ __set。也就是说,它们确实有一些缺点:

  • 它们比正常的函数调用得多,尽管在实践中应该有所不同,因为数据库访问要慢几个数量级
  • __get/__set仅在字段不可见时调用;如果您在实体类的代码中访问属性,它们不会被调用,并且代理没有机会加载自己。(Doctrine 试图通过在调用其公共方法之一时立即加载代理来避免这种情况,但也有一些例外情况,例如__construct__wake没有意义的地方,因此您可能会遇到麻烦,例如读取构造函数。)
  • PHP 有一些与魔术方法相关的令人困惑的行为 - 例如empty($entity->field)不会调用__get(因此如果使用它会破坏代理行为)
于 2012-06-07T09:45:18.893 回答
6

如果某些信息应该公开,请为其定义一个 getter。如果它是可修改的,请添加一个设置器(更好的是,添加一个流利的设置器!)。

API 以这种方式更干净,不涉及任何魔法。我不喜欢我的代码中的魔法。

只是我的两分钱:)


我所说的“流利的设置器”是指实现流利的接口模式的人。

于 2010-12-27T08:13:17.667 回答
2

是的,getter 和 setter 方法是访问数据的方式。它们有点麻烦,这就是为什么有些人不喜欢教义2或休眠的原因。但是您只需要为每个实体执行一次,然后它们就可以非常灵活地生成您希望的输出格式。您可以使用 cli 为您执行其中的一些操作。但是当你让它们滚动时,我觉得这没什么大不了的。特别是因为您只对您需要的属性执行此操作。

干杯

于 2010-12-16T13:45:47.550 回答
2

而不是有单独的getter和setter,甚至使用魔法函数。在课堂上有这样的东西有问题吗

public function Set($attrib, $value)
{
    $this->$attrib = $value;    
}

public function Get($attrib)
{
    return $this->$attrib;
}   

它使访问属性变得非常容易,并且意味着它们可以从密钥对数组中动态设置。有什么意见吗?或替代建议?

于 2012-01-14T18:55:01.007 回答
1

Doctine 2 提供了[命令行工具][1] 来生成基本实体类

使用以下内容从映射中获取基本的实体类定义,并为每个属性提供 getter/setter 函数:

path/to/doctrine_cli orm:generate-entities --generate-methods=true path/to/entities/

您仍然负责修改每个 getter/setter 以确保它们是正确的数据类型,因为为实体生成的 getter/setter 方法不进行任何类型转换/转换。

于 2011-12-14T20:42:11.200 回答