我越来越多地看到这种情况,我不确定我需要做什么来阻止这个警告:
已弃用:创建动态属性...已弃用
这是我的课:
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)
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)