2013-03-08 83 views
1

我最近遇到這個代碼問題,我很不清楚它爲什麼產生這些結果。爲什麼這個Getter和Setter的行爲是這樣的?

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]; //internal so fine with protected. 
    } 

    public function __set($var, $val) { 
     echo "$var: $val,"; 
     $this->$var = $val; 
    } 
} 

$m = new Magic(); 

//1 
//echo $m->a; 
//prints A 

//2 
//echo $m->a; 
//echo $m->b; 
//prints Ab, B 

//3 
//echo $m->a.",," . $m->b;  
//prints b,A,,B 

我無法理解號3.行爲如果有人能解釋我會很感激,因爲我無法找到任何答案,此行爲的任何地方。

我瞭解訪問修飾符和屬性可見性,但我必須有一些空白,因爲不確定爲什麼'b'先打印,因爲調用protected屬性的getter可以這樣做。

此外,我會想'A'會先打印(如1和2)。
發現它奇怪爲什麼它在同時回聲'a'和'b'時表現不同。

我能想到的唯一的事情是echo
- 帶有逗號的版本,每個參數進行評估,進而
呼應-The點的版本是不同的,它有,才能呼應的全面評價請求。
但不知道(它是如何評估?)。

感謝

+0

請問downvoted的人請解釋原因? – 2013-03-08 12:16:17

+0

我不知道,但我發現這個問題沒有錯,寫得很好,有作者的例子和自我嘗試,所以我會給你我的投票。 – Voitcus 2013-03-08 12:26:44

+0

謝謝@Voitcus。有2 downvotes不知道爲什麼。這是一個似乎很奇怪的行爲的通用問題。 – 2013-03-08 12:28:22

回答

2

這是因爲在__get方法echo的。 如果您調用echo $m->a.",," . $m->b;而不是首先調用聲明中的函數。 因此__get中的echo將首先被調用。

+0

所以主要'回聲'不打印任何東西,直到它完成評估(即命中它)? getter回聲是否打印立即? – 2013-03-08 12:29:21

+0

right..it去內部到外部的方式 – bitWorking 2013-03-08 12:35:12

+1

是的,這裏有2個操作:第一個是字符串連接,然後這個連接的結果被傳遞給你的echo命令輸出。事情是:當連接完成時,getter的內部已經將「b」回顯給stdout,所以當你的echo發生時,它就會被附加到它。 – 2013-03-08 12:35:35

1

這無關,每說,但與操作數的計算順序做PHP OOP:

echo ($m->a . ",," . $m->b); 

是3個操作數的串聯:

  • $ M->答:本身返回 「A」
  • ,,:回報 「,,」(杜)
  • $ M-> b則兩個T通過調用$ m - > __獲得('b'):首先它回聲「b」(在吸氣功能本身中),然後返回「B」用於連接。

因此,當3個操作數連接成一個字符串「A ,, B」時,程序已經回顯了「b」。然後將連接字符串傳遞給您的命令echo以輸出,因此最終結果爲:「b,A ,, B」

+0

但是,這不會導致B之前打印? – 2013-03-08 12:33:10

+0

爲什麼B會在A之前打印?你的連接確實(「A」,「,,」,「B」),如預期那樣評估爲「A ,, B」。只是在內部,當「B」被解析時,你的getter已經*已經*向標準輸出回顯「b」。 – 2013-03-08 12:38:55

+0

啊是的,看看你的意思,歡呼聲只是花了我多一點時間,看看你的意思。 – 2013-03-08 12:40:44