如题,类中有私有变量,如果加上这些魔术方法,我觉得很奇怪,这样不破坏了封装了吗?能否解释一下呢?
微信里点“发现”,扫一下
二维码便可将本文分享至朋友圈。
返回什么值是由你决定的…
打了一大堆才想起来搜一下,知乎上已经有很好的回答了。
看走眼了,看成了 setter 和 getter。 这俩魔术方法的前提条件手册中说:如果对属性的读写是 “不可达” 的,会触发这个方法。
class User { private $username; private $password; public function __set($name,$value) { $this->$name = $value; } public function __get($name) { return $this->$name; } }
上面的 password 显然是不可达的,但是因为魔术方法,此时却可以访问。鉴于此你可以简单把这俩魔术方法理解成 setter 和 getter 的偷懒行为。如果可以,尽量写完整的 setter 和 getter。
password
想一想还是再补充下,上面说的“偷懒”并不准确。实际上有目的性的使用这两个方法会给开发带来很大的便利。例如 eloquent 中的 accessor (public function getXxxAttribute)和 scope 显然只能用过 __GET 实现,这样方便用户动态的为模型 Query 和模型属性增加处理方法。现在框架中基本都用到了这俩魔术方法。因为是“有目的性”的,是为了便利性故意进行的设计,所以上面忽略了谈这点。
accessor
scope
__GET