2012-02-03 108 views
15

實施例(設置未聲明的屬性時引發錯誤):如何避免在PHP動態屬性

error_reporting(E_ALL | E_STRICT); 
class Test {} 
$obj = new Test(); 
$obj->undeclared = "oops"; // I want an error here !! :(
echo $obj->algo;    // oops 

我測試PHP 5.2.11和5.3.0。

我不想在我的對象中使用動態屬性。
是否有可能迫使PHP在這種情況下引發錯誤?

+0

'$ obj-> undeclared'如何爲您造成問題? – 2012-02-03 23:16:48

+0

class Test {public $ myVar; } $ obj-> my_var = TRUE;/*錯字*/if($ obj-> myVar){/ *哦,哦! * /} – Enrique 2012-02-03 23:21:20

+0

你需要一個好的IDE來防止這樣的錯字。 – 2012-02-03 23:25:06

回答

13

使用__set()

<?php 
class Test { 

    public $bar; 

    public function __set($name, $value) { 
     throw new Exception('Cant set!'); 
    } 
} 

$obj = new Test; 
$obj->bar = 'foo'; 
$obj->foo = 'evil'; 
?> 
+3

是的,這將起作用,但然後我需要改變我所有的類來添加該功能,這並不好。這應該由PHP本地完成。 – Enrique 2012-02-03 22:58:42

+0

好戲!!!!!檢查它「繼承正常」,所以我會在我的基類中使用它! :) – 2014-01-09 11:25:01

0

「我不想在我的對象中使用動態屬性。」我假設你的意思是你不希望你的對象變量永遠不被定義?如果是這種情況,那麼就實例化所有的類變量。如果你真的擔心它們是不變的而不是動態的,你甚至可以使它們變成靜態的。

如果你試圖訪問一個不存在的對象變量,那麼PHP 將會在處拋出一個錯誤。 radmen建議的答案實際上會使得它不會拋出錯誤,而是會動態地爲您動態創建未定義的對象變量。

+0

不,我想要一個錯誤/通知/警告當我試圖設置一個屬性,而不是在我的類中聲明的(也就是說,我不想在我的對象中的動態屬性,如果沒有在我的聲明類然後它不應該存在,永遠不會)。如果我想要的話,那麼我會使用__set和__get。 – Enrique 2012-02-03 23:02:01

+0

那麼,PHP確實在做你正在尋找的東西。您可能需要將E_WARNING添加到錯誤報告中才能顯示。 – 2012-02-03 23:07:25

+1

不,它不,並且如果你看了我的例子,你會看到我添加了包括E_WARNING的E_ALL(並且我還添加了E_STRICT,因爲它是唯一沒有包含在E_ALL中的,至少在5.4之前) – Enrique 2012-02-03 23:24:08