PHP 警告已弃用:不推荐创建动态属性

Joh*_*925 30 php

我越来越多地看到这种情况,我不确定我需要做什么来阻止这个警告:

已弃用:创建动态属性...已弃用

这是我的课:

class database {

    public $username = "root";
    public $password = "password";
    public $port = 3306;

    public function __construct($params = array())
    {
        foreach ($params as $key => $value)
        {
            $this->{$key} = $value;
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

这就是我实例化它的方式。

$db = new database(array(
    'database' => 'db_name',
    'server' => 'database.internal',
));
Run Code Online (Sandbox Code Playgroud)

这给了我两条信息:

已弃用:不推荐创建动态属性数据库::$database

已弃用:不推荐创建动态属性数据库::$server

IMS*_*SoP 30

该警告告诉您,您尝试设置的属性未在类或其任何父级中声明

当你运行这个时:

class database {

    public $username = "root";
    public $password = "pasword";
    public $port = 3306;

    public function __construct($params = array())
    {
        foreach ($params as $key => $value)
        {
            $this->{$key} = $value;
        }
    }
}

$db = new database(array(
    'database' => 'db_name',
    'server' => 'database.internal',
));
Run Code Online (Sandbox Code Playgroud)

大致相当于这样:

class database {

    public $username = "root";
    public $password = "pasword";
    public $port = 3306;
}

$db = new database;
$db->database = 'db_name';
$db->server = 'database.internal';
Run Code Online (Sandbox Code Playgroud)

警告是类定义中没有行说明$db->database$db->server存在。

目前,它们将动态创建为无类型公共属性,但将来,您将需要显式声明它们:

class database {
    public $database;
    public $server;
    public $username = "root";
    public $password = "pasword";
    public $port = 3306;

    public function __construct($params = array())
    {
        foreach ($params as $key => $value)
        {
            $this->{$key} = $value;
        }
    }
}

$db = new database(array(
    'database' => 'db_name',
    'server' => 'database.internal',
));
Run Code Online (Sandbox Code Playgroud)

在某些罕见的情况下,您实际上想说“这个类的属性是我决定在运行时添加的任何属性”;在这种情况下,您可以使用该#[AllowDynamicProperties]属性,如下所示:

#[\AllowDynamicProperties]
class objectWithWhateverPropertiesIWant {
    public function __construct($params = array())
    {
        foreach ($params as $key => $value)
        {
            $this->{$key} = $value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我理解委员会为什么选择这样做,但在我看来,一旦这最终被弃用并开始引发实际错误,它将比对 PHP 所做的任何其他更改更多地破坏应用程序。他们确实应该考虑采取相反的做法,并提供可明确拒绝而不是允许动态创建的属性的选项。 (3认同)

jbr*_*ahy 15

因此,警告来自添加动态类属性的构造函数。如果您不必动态且真实地传递这些字段,那么您似乎确实将简单的事情变得过于复杂,那么请像这样尝试。

class database {

    public $username = "root";
    public $password = "pasword";
    public $port = 3306;
    public $database = 'db_name';
    public $server = 'database.internal';
}


$db = new database();
Run Code Online (Sandbox Code Playgroud)

您需要动态参数有什么原因吗?你也可以这样做:

class database {

    public $username = "root";
    public $password = "pasword";
    public $port = 3306;
    public $database;
    public $server;

    public function __construct($params = array())
    {

        foreach ($params as $key => $value)
        {
            $this->{$key} = $value;
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

如果您提前添加参数,它们就不是动态的,您只是为已经存在的内容分配一个值。

现在应该可以正常工作,没有任何警告。


$db = new database(array(
    'database' => 'db_name',
    'server' => 'database.internal',
));

Run Code Online (Sandbox Code Playgroud)


小智 9

在类上方添加AllowDynamicProperties将使警告消失:

#[\AllowDynamicProperties]
class database {
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,我不会称之为“修复”。它会让警告消失,但警告“告诉你一些有用的东西”。如果该类需要 $database 和 $server 属性,它应该*定义*它们,然后它们就不会是“动态的”,并且不会有警告。 (2认同)