Php 当无效时,为什么在返回之前忽略回音?

Php 当无效时,为什么在返回之前忽略回音?,php,function,methods,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)) {

在下面的示例中

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;
。。。让我困惑的是,我知道当$employee->name被访问时会出现“\u get call!”,但为什么即使在$employee->age被访问时也不会出现?我是说。。。它就在那里,但似乎_; get只考虑if-else语句中的返回。这怎么可能

观察:当然,当它在读取时检测到$age不存在时,会运行,但是…当它运行时,为什么它中的回声不起作用


结论:出现“\uuuu-get-called!”是因为有一次调用了“uuu-get”,其中读取了$employee->age。

\uu-get()
在访问对象的属性时不会被调用。当您读取
$employee->age
(它不是您对象的现有属性)时,它会运行
$name
$employee
的属性,因此不会为它调用
\u get
:直接读取属性


所以,
\uu get
被调用一次:对于
年龄
来说,你的假设是错误的

我知道当$employee->name被accesed时会出现“\u get called!”

不,没有<代码>\uu get
仅在您尝试访问不存在的成员时调用。您已经定义了一个名为
$name
的可公开访问的成员,这是行
var$name
所做的。读/写
$employee->name
永远不会调用神奇的
\uuuu get
\uu set
方法

不是
$employee->name
导致打印
“\uu get called”
$employee->name
正在返回
“Mario”
,即您分配给该成员的值,这就是正在打印的值。是
$employee->age
导致打印
“\uu被叫”

我试图更好地解释这些行以及它们在
\uuu 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
$employee=新员工();
$employee->name=“Mario”#分配给$name
echo$employee->name.“
”;#从$name读取“Mario”,不调用 echo$employee->age;#尝试读取$age,调用
回复:你的观察

观察:当然,当它在读取时检测到$age不存在时,会运行,但是…当它运行时,为什么它中的回声不起作用


回声确实起作用。之所以您只看到一个
“\uuuu get call!”
,是因为通过尝试访问
$employee->age

@AndrewG.H,
\uu get
只被调用一次。我已经更新了我的答案来澄清。每次调用
\uuu get
时都会运行回显-这是一次。它确实有效。当您看到“\uuuu get called!”时,由于您正在访问一个不可访问的属性(
age
$name
是一个可公开访问的属性,这就是为什么在该行中从未调用过
\uu 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