示例:
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引发错误?
xlpyo6sf1#
“我不希望在我的对象中有动态属性。”我假设你的意思是你不希望你的对象变量被定义。如果是这样的话,那就示例化你所有的类变量。如果你真的关心它们是常量而不是动态的,你甚至可以把它们变成静态的。如果你试图访问一个不存在的对象变量,那么PHP * 将 * 抛出一个错误. radmen建议的答案实际上是这样的:PHP将动态地为你创建一个未定义的对象变量,而不是抛出一个错误.
elcex8rz2#
是否使用__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'; ?>
ojsjcaue3#
对你的错误信息再仔细一点,你就可以帮助你自己的编码了。把下面的作为你的基类设置将:1.保护此类的使用不覆盖属性1.保护变量的拼写错误(特别是驼峰式错误),例如$this-〉callerID按预期返回,但$this-〉callerID抛出异常并防止代码错误。
public function __set($name,$value) { switch ($name) { default: // we don't allow any magic properties set or overwriting our properties try { $error = "Assignment of {$name} in " . static::class . ' not allowed because it is a magic variable or read-only property.'; throw new \RuntimeException($error); } catch ( \RuntimeException $e ) { echo 'Caught exception: ' . $e->getMessage() . PHP_EOL; } } } public function __get($name) { switch ($name) { default: // we don't allow any magic properties try { $error = "var {$name} is not a property of " . static::class . '.'; throw new \RuntimeException($error); } catch ( \RuntimeException $e ) { echo 'Caught exception: ' . $e->getMessage() . PHP_EOL; } } return null; } public function __isset($name) { switch ($name) { default: return false; } }
8fq7wneg4#
记录在案:PHP 8.2**(2022 - 12 - 08发布)中已弃用动态属性。从php PHP 8.2开始,动态设置属性会抛出一个弃用通知。在PHP 9中,这会引发一个错误。请参见www.example.comhttps://www.php.net/releases/8.2/en.php#deprecate_dynamic_properties
4条答案
按热度按时间xlpyo6sf1#
“我不希望在我的对象中有动态属性。”我假设你的意思是你不希望你的对象变量被定义。如果是这样的话,那就示例化你所有的类变量。如果你真的关心它们是常量而不是动态的,你甚至可以把它们变成静态的。
如果你试图访问一个不存在的对象变量,那么PHP * 将 * 抛出一个错误. radmen建议的答案实际上是这样的:PHP将动态地为你创建一个未定义的对象变量,而不是抛出一个错误.
elcex8rz2#
是否使用__set()?
ojsjcaue3#
对你的错误信息再仔细一点,你就可以帮助你自己的编码了。把下面的作为你的基类设置将:
1.保护此类的使用不覆盖属性
1.保护变量的拼写错误(特别是驼峰式错误),例如$this-〉callerID按预期返回,但$this-〉callerID抛出异常并防止代码错误。
8fq7wneg4#
记录在案:PHP 8.2**(2022 - 12 - 08发布)中已弃用动态属性。
从php PHP 8.2开始,动态设置属性会抛出一个弃用通知。在PHP 9中,这会引发一个错误。
请参见www.example.comhttps://www.php.net/releases/8.2/en.php#deprecate_dynamic_properties