PHP 内置了 _get 和 _set 函数。是为每个变量编写自己的 get 和 set 函数还是使用带有大量 if else if 的内置函数更好?每种方法的优缺点是什么?
3 回答
__get
并且__set
是通常应该用来解决难题而不是用作设计基础的魔术方法。
例如,我发现自己在一个项目中,我必须分析一个使用具有深度继承 (> 2) 的 OOP 的站点,并且其中一个重要的基类有一个名为name
. 但是,它也有 getter 和 setter ( getName
, setName
),它们访问该属性仅仅是为了获取和设置它。许多类被调用getName
并且同样多的类name
直接访问了该属性!不是很棒的设计。
神奇的方法使我能够通过将属性重命名为并将其设为私有来解决问题,_name
通过 getter 和 setter 强制对属性的所有请求。
话虽这么说,如果您只是将属性视为变量,则不需要 getter 和 setter。在这种情况下,只需将财产公之于众!
在您的情况下,由于正在进行验证/清理,您应该使用 getter 和 setter 并将它们直接编码为方法(而不是不必要地从魔术方法中产生开销)。
这是我处理这个问题的方法。
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 魔术方法。
我倾向于遵循这样的规则,即如果您有复杂的 get 或 set 逻辑,则添加单独的 get 或 set 方法。如果您正在做一些简单的事情,您可以利用__get
或者__set
当您在许多自定义 get/set 方法中重复自己时。