在以下示例中
class Employee
{
var $name;
var $city;
protected $wage;
function __get($propName)
{
echo "__get called!<br />";
$vars = array("name","city");
if (in_array($propName, $vars))
{
return $this->$propName;
} else {
return "No such variable!";
}
}
}
$employee = new Employee();
$employee->name = "Mario";
echo $employee->name."<br />";
echo $employee->age;
输出结果为:
Mario
__get called!
No such variable!
...让我困惑,我明白“__get叫!”当$ employee-&gt;名称被加入时出现,但为什么即使加入$ employee-&gt;年龄也不会出现?我的意思是......它就在那里,但似乎__get只考虑if-else语句中的返回。怎么可能?
观察:当然__get运行时检测到$ age在读取时不存在,但是......当它运行时,为什么回声不起作用?
结论:“__get叫!”因为一次调用__get而出现,其中读取了$ employee-&gt;年龄。
答案 0 :(得分:4)
你的假设是错误的。
我明白“__get叫!”当$ employee-&gt;名称加入
时出现
不,它没有。仅当您尝试访问不存在的成员时才会调用__get
。您已定义了一个名为$name
的可公开访问的成员,这就是行var $name
的作用。阅读/写入$employee->name
将从不调用神奇的__get
或__set_
方法。
导致$employee->name
的{{1}}不是"__get called"
; $employee->name
返回"Mario"
,您分配给该成员的值, 正在打印的内容。 $employee->age
导致"__get called"
被打印。
我试图更好地解释这些行以及他们对__get
所做的事情:
$employee = new Employee();
$employee->name = "Mario"; # assign to $name
echo $employee->name."<br />"; # read "Mario" from $name, does NOT invoke __get
echo $employee->age; # attempt to read $age, invokes __get
RE:你的观察
观察:当然__get运行时检测到$ age在读取时不存在,但是......当它运行时,为什么回声不起作用?
echo 工作。您只看到一个"__get called!"
的原因是__get
仅通过尝试访问$employee->age
而被调用一次。
答案 1 :(得分:2)
__get()
。当您阅读$employee->age
(它不是您对象的现有属性)
答案 2 :(得分:2)
$name
是$employee
的属性,因此不会为其调用__get
:直接读取该属性。
因此,__get
被调用一次:age
。