PHP内置了_get和_set函数。为每个变量编写自己的get和set函数是否更好,或者使用内置函数和if if if if?每种方法的优缺点是什么?
答案 0 :(得分:4)
__get
和__set
是神奇的方法,通常应该用于解决难题而不是用作设计基础。
例如,我发现自己处于一个项目,我必须分析一个使用OOP深度继承的网站(> 2),其中一个重要的基类有一个名为name
的公共属性。但是,它还具有访问该属性的getter和setter(getName
,setName
),仅用于获取和设置它。许多类都调用了getName
,并且直接访问了name
属性。设计不是很好。
魔术方法允许我通过将属性重命名为_name
并将其设为私有来解决问题,通过getter和setter强制所有对属性的请求。
这就是说,如果你只是像处理一个变量那样处理一个属性,就不需要getter和setter。在这种情况下,只需公开财产!
在您的情况下,由于正在进行验证/清理,您应该使用getter和setter并将它们直接编码为方法(而不是不必要地从魔术方法中产生开销)。
答案 1 :(得分:3)
以下是我如何处理这个问题。
final public function __set($key, $value) {
$method = 'set' . ucfirst($key);
if (method_exists($this, $method)) {
$this->data[$key] = $this->$method($value);
} else {
$this->data[$key] = $value;
}
}
final public function __get($key) {
$method = 'get' . ucfirst($key);
if (method_exists($this, $method)) {
return $this->$method($this->data[$key]);
} else {
return $this->data[$key];
}
}
如果您有属性的自定义处理程序,则会调用它(假设它名为getProperty)。否则,使用默认的get / set magic方法。
答案 2 :(得分:2)
我倾向于遵循这样的规则:如果你有复杂的get或set逻辑,那么添加一个单独的get或set方法。如果您正在做一些简单的事情,那么当您在许多自定义get / set方法中重复使用时,可以使用__get
或__set
。