代码之家  ›  专栏  ›  技术社区  ›  Josh Curren

php的get&_set或每个变量的唯一get和set函数?

  •  6
  • Josh Curren  · 技术社区  · 16 年前

    PHP内置了get和set函数。是为每个变量编写自己的get和set函数,还是使用带有大量if-else if的内置函数?每种方法的优缺点是什么?

    3 回复  |  直到 16 年前
        1
  •  4
  •   webbiedave    16 年前

    __get __set 是通常用于解决困难问题而不是作为设计基础的神奇方法。

    例如,我发现自己在一个项目中,我必须分析一个使用OOP和深度继承(>2)的站点,其中一个重要的基类有一个名为 name . 然而,它也有getter和setter( getName , setName )访问该属性的目的仅仅是获取和设置它。许多类调用 获得名称 和很多人一样 名称 直接拥有!不是很好的设计。

    魔术方法允许我通过将属性重命名为来解决问题。 _name 使其私有化,通过getter和setter强制所有对属性的请求。

    也就是说,如果您只是将一个属性当作一个变量来处理,就不需要getter和setter。在这种情况下,只需将财产公之于众!

    在您的例子中,由于正在进行验证/清理,所以您应该使用getter和setter,并将它们直接编码为方法(而不是不必要地从magic方法中产生开销)。

        2
  •  3
  •   Richie Cotton    16 年前

    下面是我如何处理这个问题。

      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方法。

        3
  •  2
  •   rojoca    16 年前

    我倾向于遵循这样的规则:如果您有复杂的get或set逻辑,那么添加一个单独的get或set方法。如果你做一些简单的事情,你可以利用 __get __set 当你以其他方式在很多定制的get/set方法中重复你自己的时候。