php 如何替换不推荐使用的动态属性?[副本]

carvr3hs  于 2023-05-21  发布在  PHP
关注(0)|答案(2)|浏览(141)

此问题已在此处有答案

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;这样的指令创建单个对象,但我发现这最终会导致长代码,什么也没有。
有没有更快、更有效的方法?
我在谷歌上搜索了又搜索,但没有发现任何有用的信息。

70gysomp

70gysomp1#

您需要将属性设置为类属性,而不是动态属性。如果你想继续使用你的类,没有办法:
方式1

class planet {
    public $id; 
    public $e;
    public $a;
    public $m;
    public $i;
    public $π;
    public $n;
    
    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->π = $π;
    }
}

方式二:

class planet {
    public $n; 
    function __construct(public $id, public $a, public $m, public $i, public $e, public $π) {
        $this->n = .9856076686 / ($a * sqrt($a));
    }
}

你也可以用AllowDynamicProperties标记你的类,虽然我不推荐这样做。

#[\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->π = $π;
    }
}

据我所知,在PHP 9+中,在用属性标记类之后使用动态属性仍然是允许的。
在实现了这些解决方案之一之后,调用new来构造类的方式或使用类的方式将不会改变。

643ylb08

643ylb082#

当你使用PHP8时,使用Constructor promotion:

public $n;

function __construct(public $id, public $a, public $m, public $i,
                     public $e, public $π) {
  $this->n = .9856076686 / ($this->a * sqrt($this->a));
}

必须显式声明$n,因为它不是c'tor参数。另外,考虑对属性和参数进行类型暗示。
顺便说一句:使用π作为变量名不是一个好主意。使用pi代替。

相关问题