为什么“A”会消失?

时间:2012-03-18 13:01:22

标签: php oop

我正在阅读一些Zend PHP认证问题并且坚持这个问题:

以下内容的输出是什么:

<?php

class Magic{

    public $a = "A";
    protected $b = array("a" => "A", "b" => "B", "c" => "C");
    protected $c = array(1,2,3);

    public function __get($v){
        echo "$v,";
        return $this->b[$v];
    }

    public function __set($var, $val){
        echo "$var: $val,";
        $this->$var = $val;
    }

}

$m = new Magic();
echo $m->a.",".$m->b.",".$m->c.",";
$m->c = "CC";
echo $m->a.",".$m->b.",".$m->c;

答案: b,c,A,B,C,c:CC,b,c,A,B,C

我知道在尝试访问/设置无法访问的属性时会调用__get()和__set但有人可以告诉我$ m-&gt; a会发生什么?那为什么它会消失?

提前致谢

2 个答案:

答案 0 :(得分:7)

echo $m->a.",".$m->b.",".$m->c.",";

请注意,字符串正在连接,但__get输出密钥的名称。小写字母是键名,大写字母是值。

  

b,c,A,B,C,c:CC,b,c,A,B,C

a通常访问,而不是通过__getbc通过__get keys 首先是echo,然后返回它们的值,连接到字符串并在输出“b,c”之后输出

所以这表明__getb触发了c方法,但a没有触发b方法,而是“A”,“B”和输出“C”,然后设置值“CC”,然后再次通过c访问__get和{{1}},然后“A”,“B”和“C”再次输出。

答案 1 :(得分:2)

行中的所有变量

$m->a.",".$m->b.",".$m->c.","
在回显之前,

首先被解析。

因此,调用$ m-&gt; b执行__get魔术方法,然后回显“$ v”,;与调用$ m-&gt; c相同。 只有在解析了所有值(并且回显了__get方法的输出)之后,才会回显返回值。