【发布时间】:2014-06-03 16:18:13
【问题描述】:
在OO编程中使用魔术方法__get()和__set()会被看不起,这些会导致封装泄漏出一个类吗?例如:
class User {
private $username;
private $password;
public function __set($name,$value) {
$this->$name = $value;
}
public function __get($name) {
return $this->$name;
}
}
这有效地使private/protected 变量public。
【问题讨论】:
-
不!这取决于实施。
-
__get和__set仅在“无法访问的属性”上调用。password在技术上“无法访问”,因为它是private。因此,当您访问password时,会调用__get()。这样做可以“泄漏”private变量。问题是......为什么你会像这样首先将这些方法添加到你的类中?如果您需要__get()和__set()方法,一种常见的方法是添加private $data = array()并让它们访问该数组。$this->data[$name] = $value;php.net/manual/en/language.oop5.overloading.php#example-228 -
__get、__set、__call 和 __invoke 基本上是 PHP 实现 operator overloading 的方式。虽然这并不完全正确(因为可访问的属性不会使运算符重载),但我觉得这是一个很好的比较,因为如果您正确使用 __get 和 __set ,那么您将在与使用运算符重载的相同情况下使用它们。基本上,当您的对象以这种方式运行但又不会破坏封装时,您可以使用它。