2012-03-18 106 views
1

我會通過一些Zend的PHP認證的問題和我堅持在這一個:爲什麼「A」消失?

什麼是以下的輸出:

<?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:c,c,b,c,A,B,C

我知道__get()和__set在嘗試訪問/設置無法訪問的屬性時被調用,但有人可以告訴我發生了什麼 - >一個?爲什麼它消失了?提前

感謝

+0

你是什麼意思的「消失」?輸出包含「A」。 – 2012-03-18 13:05:54

+1

它是一個魔術課......它不會放棄它的魔法祕密!嘗試使用'AbraCadabra'框架;) – Lix 2012-03-18 13:10:41

+1

他期待「_」被__get打印,但__get不會被調用,因爲「$ a」是公開的 – dldnh 2012-03-18 13:11:23

回答

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

注意該字符串被連接在一起,但__get輸出鍵的名稱。小寫字母是關鍵名稱,大寫字母是值。

B,C,A,B,C,C:CC,B,C,A,B,C

a訪問通常,不通過__getbc是通過__get訪問並且首先是echo'd,然後將它們的值返回,連接成字符串並輸出後面的「b,c」的輸出

那麼這表明是該__get方法被觸發爲bc但不能用於a,則值「A」,「B」和「C」被輸出,則值「CC」被設置,然後再通過__get訪問bc,然後再次輸出「A」,「B」和「C」。

+0

不錯的答案。但有一個問題:爲什麼'var_dump'表現相同? – Shomz 2012-03-18 13:13:28

+0

爲什麼不應該呢?你有一個具體的例子嗎? – deceze 2012-03-18 13:14:28

+0

其實不,沒關係,我的不好。 Var_dump行爲不一樣。 – Shomz 2012-03-18 13:17:46

2

所有在該行

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

的變量首先被解析,這是呼應之前。

因此,對$ m-> b的調用執行__get magic方法,然後回顯「$ v」,與調用$ m-> c相同。 只有在解析了所有值(並且__get方法的輸出被回顯)後,纔會回顯返回值。