2012-02-03 60 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