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.",";
这是ZCE的一个示例问题(不是来自实际考试)。有人可以向我解释......这里发生了什么,为什么答案是......根本不是我所期待的?
b, c, A, B, C,c: CC,b, c, A, B, C,
答案 0 :(得分:3)
如果您没有实际范围,则会调用__get
/ __set
来访问该属性/该属性的权限。
所以$m->a
直接获得“A”; $m->b
和$m->c
首先调用__get("b")
和__get("c")
(在回显“b,c”后返回“B”和“C”)
同样适用于$m->c = "CC";
:它调用__set("c", "CC")
,因为$c
是受保护(不可访问)的属性。 (在回显“c:CC”后将$ m-> c设置为“CC”)