2010-09-13 257 views
0

林」想知道如果這是可能的:__set和字符串連接

我已經成功地使用__set()魔術方法將值設置爲一個類的屬性:

class View 
{ 
    private $data; 

    public function __set($key, $value) 
    { 
     $this->data[$key] = $value; 
    } 
} 

所以我能到:

$view = new View(); 
$view->whatever = 1234; 

問題來了,當我想連接一個字符串爲例。看起來__set()沒有被調用(事實上它沒有被調用)。

$view = new View(); 
$view->a_string = 'hello everybody'; //Value is set correctly 

$view->a_string.= '<br>Bye bye!';  //Nothing happens... 

echo $view->a_string; 

這輸出「大家好」。我無法在第二個任務中執行__set()。 閱讀php.net它說:

__set() is run when writing data to inaccessible properties. 

因此,作爲對a_string已經存在,__set沒有被調用。 我的問題最後是...我怎麼能實現這個連接操作?

注: 好吧......墨菲走過來,只要我這貼給我的答案...

答案(我的理解),是PHP是不能夠決定是否a_string可用,因爲我沒有定義__get()方法。

定義__get()允許php找到當前值a_string,然後使用__set()連接該值。

回答

4

您應該添加一個__get()方法,該方法允許您像訪問__set()一樣訪問不可訪問的屬性。然後,您可以執行以下操作:

$view->myvar = $view->myvar.'Added text.'; 

的__get()方法是:

public function __get($var) { 
    return (isset($this->data[$var])) ? $this->data[$var]: ''; 
} 
+0

是的,編輯我的帖子後我看到了這個。 – 2010-09-13 21:24:57

+0

我必須在編輯它時正確放棄這一點。 – 2010-09-13 21:29:25

+1

在旁註:返回NULL而不是空字符串似乎更合適。 – Wrikken 2010-09-14 00:26:34

0

這是因爲__set()是一種方法,而不是一個字符串。如果你想讓它像一個字符串一樣「行動」,你可以改變它。

class View 
{ 
    private $data; 

    public function __set($key, $value) 
    { 
     if (empty($this->data[$key])) { 
      $this->data[$key] = $value; 
     } else { 
      $this->data[$key] .= $value; 
     } 
    } 
} 
1

僅供參考,對於簡單的任務,魔術方法甚至沒有必要的。

class A { 

} 

$a = new A(); 

$a->str = '1'; 
$a->str .= '2'; 
echo $a->str; // outputs 12 

這將工作得很好,因爲PHP將通過分配創建新屬性。當需要在值上運行額外的檢查/代碼時,通常會使用__set/get。

+0

我需要神奇的方法,因爲我必須將數據存儲在$ data成員中。 – 2010-09-14 05:52:13