PHP';s_get&_为每个变量设置或唯一的get和set函数?

PHP';s_get&_为每个变量设置或唯一的get和set函数?,php,get,set,encapsulation,accessor,Php,Get,Set,Encapsulation,Accessor,PHP内置了_get和_set函数。为每个变量编写自己的get和set函数,还是使用内置函数和大量if-else-if更好?每种方法的优缺点是什么?我倾向于遵循这样一条规则:如果您有复杂的get或set逻辑,那么添加一个单独的get或set方法。如果你在做一些简单的事情,你可以利用\uuuu get或\uu set,否则你会在许多自定义的get/set方法中重复你自己。\uu get和\uu set是神奇的方法,通常应该用来解决困难的问题,而不是作为设计基础 例如,我发现自己在一个项目中,我必须

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

我倾向于遵循这样一条规则:如果您有复杂的get或set逻辑,那么添加一个单独的get或set方法。如果你在做一些简单的事情,你可以利用
\uuuu get
\uu set
,否则你会在许多自定义的get/set方法中重复你自己。

\uu get
\uu set
是神奇的方法,通常应该用来解决困难的问题,而不是作为设计基础

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

通过将属性重命名为
\u 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魔术方法。

如果您解释为什么需要使用
\uu get
\uu set
,而不仅仅是公共字段,可能会有所帮助。您可以随时在以后更改为
\uuu get
\uu set
。我希望能够检查数据是否合法,并且在保存到数据库之前需要重新格式化一些数据,我猜有很多地方都在使用$instance->name,对吗?因为我个人认为最好是将实现该功能的类更改为使用getName()/setName(),并使$name受到保护。我想你可以让你的uuu get和uu set方法发出一个E_通知,或者在调用时弃用E_u,这样东西仍然可以工作,但是你会在没有通过setter/getter进行操作的地方收到警告。不过那只是我。