2015-09-17 59 views
6

我對程序的工作方式感到困惑;代碼應打印A, bB卻是露出bA,BPHP中返回和回顯的行爲

class SampleClass { 
    public $a = "A"; 
    protected $b = array ("a" => "A", "b" => "B", "c" => "C"); 

    public function __get($v){ 
     echo "$v"; 
     return $this->b[$v]; 
    } 
} 

$m = new SampleClass(); 

echo $m->a . ", " . $m->b; 
+1

你爲什麼認爲,那預期的產量應該是'A,bB'? –

+1

對我來說,陌生人是** echo $ m-> b **返回bB和** echo $ m-> a **返回A而不是aA這一事實 –

+3

$ a是一個公共變量,因此它不需要使用__get方法。 –

回答

9

這非常有意義真的。讓我們想想的執行順序:

之前PHP可以重複你的請求的字符串,它必須首先評估它(即$m->a . ", " . $m->b部分)

所以在這一點上,解析器嘗試解析$ M->和$ m-> b,它解決了第一個,但第二個失敗,所以我們去魔術方法。

的魔術方法回聲東西(第一`B),然後解決自己B.

現在,我們需要完成我們開始(原始回波)。

那麼我們有什麼?

  1. 解決$ m-> b(在進程中的回聲b)。
  2. echo「A,B」

將它們結合在一起?

BA,B

+0

換句話說,由'echo $ m-> a ...'東西構建的字符串在字符串完成之前不能輸出,所以它的內容實際上在echo在方法裏面。 –

+0

謝謝帕特里克 – Dudling

+0

@Dudling不要忘了接受答案,如果它幫助你:) – Patrick

1

這很奇怪是吧,但它不是做你覺得它在做什麼。

運行此代碼會做一些不同的事情。

class SampleClass { 
    public $aaa = "A"; 
    protected $b = array ("a"=> "A", "b" => "B", "c" => "C"); 

    public function __get($v){ 
     echo "$v"; 
     return $this->b[$v]; 
    } 
} 


$m = new SampleClass(); 

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

輸出是:

abc[A, B, C]

您的原始__get不會被調用,當你做$ M->一,因爲有一個變量 'a' 進不去。它只被稱爲最後的手段,所以你應該編寫自己特定的「getter」函數。