2013-04-08 58 views
1
 
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的示例问题(不是来自实际考试)。有人可以请我解释一下......这里发生了什么,为什么答案是......根本不是我所期望的?不可思议的方法__get和__set - 来自ZCE的示例

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

回答

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”)

+0

为什么小写字母都是大写之前的大写? – Ziarno 2013-04-09 12:44:49

+0

,因为字符串是首先连接的,需要读取(__set中的echo立即在读取时调用;不等待字符串连接完成),并且只有在读取值之后才会输出字符串。 (尝试用“,”替换echo语句中的“。”,然后解释它是否有不同的回声语句。) – bwoebi 2013-04-09 12:46:52