弱弱的问下,__get()和__set()不是破坏了类封装吗?为什么要这些东西?

如题,类中有私有变量,如果加上这些魔术方法,我觉得很奇怪,这样不破坏了封装了吗?能否解释一下呢?

sodasix

返回什么值是由你决定的…

justtest

打了一大堆才想起来搜一下,知乎上已经有很好的回答了。

justtest

看走眼了,看成了 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。

justtest

想一想还是再补充下,上面说的“偷懒”并不准确。实际上有目的性的使用这两个方法会给开发带来很大的便利。例如 eloquent 中的 accessor (public function getXxxAttribute)和 scope 显然只能用过 __GET 实现,这样方便用户动态的为模型 Query 和模型属性增加处理方法。现在框架中基本都用到了这俩魔术方法。因为是“有目的性”的,是为了便利性故意进行的设计,所以上面忽略了谈这点。