如何在PHP中避免动态属性(设置未声明的属性时引发错误)

fzwojiic  于 2023-02-07  发布在  PHP
关注(0)|答案(4)|浏览(127)

示例:

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引发错误?

xlpyo6sf

xlpyo6sf1#

“我不希望在我的对象中有动态属性。”我假设你的意思是你不希望你的对象变量被定义。如果是这样的话,那就示例化你所有的类变量。如果你真的关心它们是常量而不是动态的,你甚至可以把它们变成静态的。
如果你试图访问一个不存在的对象变量,那么PHP * 将 * 抛出一个错误. radmen建议的答案实际上是这样的:PHP将动态地为你创建一个未定义的对象变量,而不是抛出一个错误.

elcex8rz

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';
?>
ojsjcaue

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;
        }
    }
8fq7wneg

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

相关问题