我正在阅读一些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会发生什么?那为什么它会消失?
提前致谢
答案 0 :(得分:7)
echo $m->a.",".$m->b.",".$m->c.",";
请注意,字符串正在连接,但__get
输出密钥的名称。小写字母是键名,大写字母是值。
b,c,A,B,C,c:CC,b,c,A,B,C
a
通常访问,而不是通过__get
,b
和c
通过__get
和 keys 首先是echo
,然后返回它们的值,连接到字符串并在输出“b,c”之后输出。
所以这表明__get
和b
触发了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方法的输出)之后,才会回显返回值。