从 PHP 8.2 开始,“动态属性”已被弃用,并将在 PHP 9.0 中删除,请参阅 https://php.watch/versions/8.2 在将动态属性重构为 WeakMap 之前,应该有一些弃用的豁免(参见上面的链接),其中之一是具有
__get
和 __set
魔术方法的类。事实上,在 PHP 8.2 上,我的代码没有产生弃用通知。
但是,似乎在升级到 PHP 8.3 后,弃用通知在以下正文中发布,即在那些豁免魔法的实现中:
public function __set($property_name, $value)
{
$this->$property_name = $value;
}
在 https://php.watch/versions/8.3 和 https://www.php.net/releases/8.3/en.php 上,我没有发现任何迹象表明豁免已被删除。
问题: 这是 PHP 8.3 文档中的疏忽,还是我遗漏了“我的”
__set
(和类似的 __get
)不足以算作豁免的某些原因?
(同时,我将
#[AllowDynamicProperties]
添加到课程中,但我仍然很好奇)
此通知不是针对
__get
和 __set
魔术方法,而是针对访问不存在的属性。报告中的行号似乎有问题。例如:
class Foo
{
private $a;
public function __set($property_name, $value)
{
$this->$property_name = $value;
}
}
$o = new Foo;
$o->a = 1; # OK, because Foo::$a exists
$o->b = 1; # Deprecated: Creation of dynamic property Foo::$b is deprecated