PHP的_get&为每个变量设置或设置唯一的get和set函数?

时间:2010-06-21 02:37:40

标签: php get set encapsulation accessor

PHP内置了_get和_set函数。为每个变量编写自己的get和set函数是否更好,或者使用内置函数和if if if if?每种方法的优缺点是什么?

3 个答案:

答案 0 :(得分:4)

__get__set是神奇的方法,通常应该用于解决难题而不是用作设计基础。

例如,我发现自己处于一个项目,我必须分析一个使用OOP深度继承的网站(> 2),其中一个重要的基类有一个名为name的公共属性。但是,它还具有访问该属性的getter和setter(getNamesetName),仅用于获取和设置它。许多类都调用了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