我记得在 Doctrine 2 模型中读到,我不应该将属性/字段设置为 public。那么你将如何公开这些字段?沙盒使用get*()
&set*()
方法。这是最好的主意吗?它非常麻烦。使用魔术方法__get()
__set()
会使类似于设置字段公开的事情吗?
你的建议是什么?
我记得在 Doctrine 2 模型中读到,我不应该将属性/字段设置为 public。那么你将如何公开这些字段?沙盒使用get*()
&set*()
方法。这是最好的主意吗?它非常麻烦。使用魔术方法__get()
__set()
会使类似于设置字段公开的事情吗?
你的建议是什么?
这就是为什么你不能使用公共属性的原因:公共字段如何在 Doctrine 2 中“打破延迟加载”?
您是正确的,__get()
并且__set()
可以更轻松地访问protected
/private
字段。
这是一个简单的例子:
public function __get($name)
{
if(property_exists($this, $name)){
return $this->$name;
}
}
当然,这可以访问所有属性。您可以将其放在所有实体都扩展的类中,然后将不可评估字段定义为private
. 或者,您可以使用数组来确定应该可以访问哪些属性:$this->accessable = array('name', 'age')
有很多方法可以保护所有属性,并且仍然有一种相当简单的方法来获取/设置它们。
就个人而言,我不喜欢具有琐碎目的的样板代码 - 它使代码变得丑陋且难以阅读。因此,我强烈喜欢__get
/ __set
。也就是说,它们确实有一些缺点:
__get
/__set
仅在字段不可见时调用;如果您在实体类的代码中访问属性,它们不会被调用,并且代理没有机会加载自己。(Doctrine 试图通过在调用其公共方法之一时立即加载代理来避免这种情况,但也有一些例外情况,例如__construct
或__wake
没有意义的地方,因此您可能会遇到麻烦,例如读取构造函数。)empty($entity->field)
不会调用__get
(因此如果使用它会破坏代理行为)如果某些信息应该公开,请为其定义一个 getter。如果它是可修改的,请添加一个设置器(更好的是,添加一个流利的设置器!)。
API 以这种方式更干净,不涉及任何魔法。我不喜欢我的代码中的魔法。
只是我的两分钱:)
我所说的“流利的设置器”是指实现流利的接口模式的人。
是的,getter 和 setter 方法是访问数据的方式。它们有点麻烦,这就是为什么有些人不喜欢教义2或休眠的原因。但是您只需要为每个实体执行一次,然后它们就可以非常灵活地生成您希望的输出格式。您可以使用 cli 为您执行其中的一些操作。但是当你让它们滚动时,我觉得这没什么大不了的。特别是因为您只对您需要的属性执行此操作。
干杯
而不是有单独的getter和setter,甚至使用魔法函数。在课堂上有这样的东西有问题吗
public function Set($attrib, $value)
{
$this->$attrib = $value;
}
public function Get($attrib)
{
return $this->$attrib;
}
它使访问属性变得非常容易,并且意味着它们可以从密钥对数组中动态设置。有什么意见吗?或替代建议?
Doctine 2 提供了[命令行工具][1] 来生成基本实体类
使用以下内容从映射中获取基本的实体类定义,并为每个属性提供 getter/setter 函数:
path/to/doctrine_cli orm:generate-entities --generate-methods=true path/to/entities/
您仍然负责修改每个 getter/setter 以确保它们是正确的数据类型,因为为实体生成的 getter/setter 方法不进行任何类型转换/转换。