为什么__get在返回无效时忽略echo?

时间:2012-02-20 19:26:26

标签: php function methods

在以下示例中

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;年龄。

3 个答案:

答案 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