2012-02-20 91 views
0

在下面的例子爲什麼__get在返回之前忽略回顯時無效?

class Employee 
{ 
    var $name; 
    var $city; 
    protected $wage; 
    function __get($propName) 
    { 
     echo "__get called!<br />"; 
     $vars = array("name","city"); 
     if (in_array($propName, $vars)) 
     { 
      return $this->$propName; 
     } else { 
      return "No such variable!"; 
     } 
    } 
} 
$employee = new Employee(); 
$employee->name = "Mario"; 
echo $employee->name."<br />"; 
echo $employee->age; 

輸出是:

Mario 
__get called! 
No such variable! 

...讓我困惑,我的理解是 「叫__get!」當$ employee-> name被接受時出現,但爲什麼即使$ employee-> age被接受也不會出現?我的意思是......它在那裏,但似乎__get只考慮if-else語句中的返回值。這怎麼可能?

觀察:當__get在檢測到$ age時不會存在時運行,但是當它運行時,它爲什麼不在其中工作?

結論:「__get叫!」由於__get的一次調用而出現,其中$ employee-> age被讀取。

+1

它確實有效。當您看到「__get called!」時,由於您正在訪問不可訪問的屬性(「age」),因此會出現這種迴應。 '$ name'是一個可公開訪問的屬性,這就是爲什麼'__get()'甚至不會在該行上調用。 – 2012-02-20 19:37:27

回答

4

你的假設是錯誤的。

我明白「__get叫!」當加入$ employee->名稱時出現

不,它不。 __get僅在您嘗試訪問不存在的成員時纔會被調用。您已經定義了一個名爲$name的公共訪問成員,這是var $name行所做的。讀/寫$employee->name永不援引魔術__get__set_方法。

這不是$employee->name導致"__get called"被打印; $employee->name正在返回"Mario",您分配給該成員的值和是正在打印的內容。它是$employee->age,導致"__get called"被打印。

我試着更好地解釋線和他們就做什麼__get

$employee = new Employee(); 
$employee->name = "Mario";  # assign to $name 
echo $employee->name."<br />"; # read "Mario" from $name, does NOT invoke __get 
echo $employee->age;   # attempt to read $age, invokes __get 

RE:你的觀察

觀察:當然,當它檢測$年齡__get奔跑在讀取時不存在,但是......當它運行時,爲什麼它中的回聲不起作用?

回聲確實的工作。您只看到一個"__get called!"的原因是因爲__get只被調用一次,試圖訪問$employee->age

+0

我明白你的觀點。 – 2012-02-20 19:41:57

2

__get()當您訪問您的對象的屬性時不被調用。這是當你閱讀$employee->age運行(這是不是你的對象的現有屬性)

+0

明顯....但那不是我的問題。 – 2012-02-20 19:32:36

+0

是的,我沒有真正閱讀:( – Vitamin 2012-02-20 19:36:18

2

$name$employee的屬性,所以__get不會調用它:該屬性直接讀取。

因此,__get正被調用一次:對於age

+0

閱讀我在主帖中添加的觀察。 – 2012-02-20 19:31:37

+0

@ AndrewG.H。我已經更新了我的答案以澄清。每次調用__get'時都會運行echo - 這是一個時間。 – Borealid 2012-02-20 19:33:44

相關問題