__get()和__set()是否意味着泄漏封装?

Pit*_*ate 3 php oop

在OO编程中,它会被瞧不起使用魔术方法,__get()并且__set()这些会导致封装泄漏出类吗?例如:

class User {
    private $username;
    private $password;

    public function __set($name,$value) {
        $this->$name = $value;
    }

    public function __get($name) {
        return $this->$name;
    }
}
Run Code Online (Sandbox Code Playgroud)

这有效地使private/ protected变量public.

Sho*_*hoe 5

你的代码:

class User {
    private $username;
    private $password;

    public function __set($name,$value) {
        $this->$name = $value;
    }

    public function __get($name) {
        return $this->$name;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下是完全没必要的.

封装并不意味着 "一堆吸气剂和二传手".你可以将它重构为:

class User {
    public $username;
    public $password;
}
Run Code Online (Sandbox Code Playgroud)

就封装而言,它们是等价的.

一般而言__get并且__set有一些用途,但如果你能做到,你应该(特别是考虑到它们比通常的方法定义"慢得多").