PHP';s_get&_为每个变量设置或唯一的get和set函数?
PHP内置了_get和_set函数。为每个变量编写自己的get和set函数,还是使用内置函数和大量if-else-if更好?每种方法的优缺点是什么?我倾向于遵循这样一条规则:如果您有复杂的get或set逻辑,那么添加一个单独的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是神奇的方法,通常应该用来解决困难的问题,而不是作为设计基础 例如,我发现自己在一个项目中,我必须
\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进行操作的地方收到警告。不过那只是我。