通常,当你访问一个不存在的类的属性时,它对那个类没有意义,很可能是输入错误。因此,使用一个不存在的 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);
1条答案
按热度按时间8fq7wneg1#
PHP 8.2(在这个问题被问到之后发布)弃用动态属性。
我试着在我的代码中找到触发弃用错误的原因(嵌套在trait中),并通过您建议的使用__set解决了这个问题: