此问题已在此处有答案:
PHP Warning Deprecated: Creation of dynamic property is deprecated(7个回答)
昨天关门了。
我很难接受PHP 8.2的动态属性弃用。我在这里寻找一个永久的解决方案,将与PHP 9.0兼容,所以添加#[AllowDynamicProperties]
属性是 * 不是 * 一个解决方案。
我的问题是例如,我曾经有过以下类:
class planet {
function __construct($id, $a, $m, $i, $e, $π) {
$this->a = $a;
$this->e = $e;
$this->i = $i;
$this->id = $id;
$this->m = $m;
$this->n = .9856076686 / ($a * sqrt($a));
$this->π = $π;
}
}
然后,我将使用以下数组创建每个行星:
$pl = [
new planet("Mercury", .38709831, 3.3011e23, 7.004986, .20563, 77.456119),
new planet("Venus", .723332982, 4.8675e24, 3.394662, .006772, 131.563703)
];
等等。
如果我现在尝试这个,当然我会得到现在(在)著名的通知:Deprecated: Creation of dynamic property planet::$a is deprecated
因此,我的问题是:我怎么能继续从数组中创建我的行星?似乎可以用$Mercury = new StdClass(); $Mercury->a = .38709831;
这样的指令创建单个对象,但我发现这最终会导致长代码,什么也没有。
有没有更快、更有效的方法?
我在谷歌上搜索了又搜索,但没有发现任何有用的信息。
2条答案
按热度按时间70gysomp1#
您需要将属性设置为类属性,而不是动态属性。如果你想继续使用你的类,没有办法:
方式1
方式二:
你也可以用
AllowDynamicProperties
标记你的类,虽然我不推荐这样做。据我所知,在PHP 9+中,在用属性标记类之后使用动态属性仍然是允许的。
在实现了这些解决方案之一之后,调用
new
来构造类的方式或使用类的方式将不会改变。643ylb082#
当你使用PHP8时,使用Constructor promotion:
必须显式声明
$n
,因为它不是c'tor参数。另外,考虑对属性和参数进行类型暗示。顺便说一句:使用
π
作为变量名不是一个好主意。使用pi
代替。