如何禁用php对象的动态属性,让它们像未定义变量一样工作

f4t66c6m  于 2023-03-07  发布在  PHP
关注(0)|答案(1)|浏览(159)

通常,当你访问一个不存在的类的属性时,它对那个类没有意义,很可能是输入错误。因此,使用一个不存在的 normal variable 会引发一个警告。
当然,在很多用例中自动属性是有用的,但是我发现在一般情况下,它会导致许多不清楚和无声的bug,在这些bug中您需要警告或错误。
我发现了一种允许动态引发错误的方法,但它看起来相当复杂(也许我可以把它变成一个trait)。此外,在解析/编译过程中得到警告或错误会很好。我在大约10年前就看到过这种报告,从那以后有更好的方法吗(比如编译器开关或其他东西)?
注意,密封类在这里也没有帮助。

class Foo {
    public $rowNumber;
    public $modificationDate;
    public $userName;

    // seal the class for dynamic properties
    public function __set($name, $value) { 
        die("Cannot set property '$name' to '$value', property does not exist\n"); 
    }

    public function __get($name) { 
        die("Cannot get value for property '$name', property does not exist\n"); 
    }
}

$x = new Foo();
$x->rowNumber = 42;
$x->modDate = "2022-12-12";     // raises error with the __set function present, otherwise nothing happens
print_r($foo);                  // raises standard warning from PHP, which is helpful
print_r($x);
8fq7wneg

8fq7wneg1#

PHP 8.2(在这个问题被问到之后发布)弃用动态属性。
我试着在我的代码中找到触发弃用错误的原因(嵌套在trait中),并通过您建议的使用__set解决了这个问题:

public function __set($property, $value) {
    assert(false, $property . " does not exist.");
}

相关问题