2013-04-08 59 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