2013-01-22 71 views
-3

Possible Duplicate:
PHP __get and __set magic methods面向對象的PHP - __set()無法訪問受保護的屬性

與OOP剛開始。 。無論如何不知道,如果我理解正確,但不應該改變$attribute的值,因爲功能__set()

<?php 
class aclass 
{ 
    protected $attribute; //edited from public to protected 
    public function __get ($name) 
    { 
     return $this->$name;  
    } 
    public function __set ($name, $value) 
    { 
     if($name == "foo") 
     { 
      $this->$name = $value; 
     } 
    } 
} 
$a = new aclass(); 
$a->attribute = "bar"; 
echo $a->attribute; 
?> 

當我運行此錯誤消息顯示:

「致命錯誤:。無法訪問受保護的財產ACLASS :: $屬性第16行」 第16行是「回聲$ a->屬性「 - 其他帖子說該屬性必須設置爲PROTECTED,但不起作用。我使用PHP 5.4.3 - 任何想法?

+1

你應該檢查其他問題,如http://stackoverflow.com/questions/4713680/php-get-and-set-magic-methods – Deele

+0

這是問過很多次之前,請開一個問題之前做一個長的搜索。 –

+2

如果你剛剛開始使用OOP,我建議稍後留下'__get'和'__set';在第一種情況下學習是有用的,但不是強制性的;掌握主要概念,並在以後回到神奇的方法。有些人不喜歡它們,並堅持編寫名爲'getPropname()'和'setPropname()'的單獨方法;這可能是一個更簡單的入門方法。此外,即將推出的PHP 5.5版本將提供更多的語法選項來定義屬性,這意味着對魔法方法的需求會減少很多。 – SDC

回答

5

__set()魔術方法將試圖訪問非公開或未定義的屬性,只有當被調用,但attribute財產IS定義和IS公衆,所以它直接訪問。

如果你想要__set()方法「接受」訪問attribute,它必須是protectedprivate

+0

它也引發未定義的屬性 – Dale

+1

@戴爾謝謝,回答更新! –

+0

將$屬性設置爲protected或private不起作用。它給出了一個錯誤:「無法訪問受保護的屬性」。對此有何想法?我去了上面關於同一主題的建議鏈接,但是相同的答案是不將該屬性設置爲公開,而是保護或私有。我錯過了什麼? –

1

__set() 將在您嘗試將值分配給未定義的屬性時調用。在你的情況下,$屬性已經定義了類,因此__set將不會被調用。

+1

這是不正確的。它會在試圖訪問私有或受保護的屬性時調用,請參閱@MatteoTassinari的anwser –

+0

@WouterJ這實際上是正確的,應該與其他答案合併 – Dale

+0

@Dale ok,我有點快點。這是正確的,但它沒有回答這個問題。我已經刪除了我的downvote。 –