Deprecated: Creation of dynamic property ... is deprecated
我越来越多地看到这种情况,我不知道我需要做什么来阻止这种警告。
这是我的课
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',
));
这给了我两个信息:
Deprecated: Creation of dynamic property database::$database is deprecated
Deprecated: Creation of dynamic property database::$server is deprecated
5条答案
按热度按时间hfwmuf9z1#
所以警告来自于构造函数添加动态类属性,如果你不需要动态地传入那些字段,看起来你确实把一些简单的东西复杂化了,那么试试这样。
是否有需要动态参数的原因?您也可以这样做:
如果提前添加参数,它们就不是动态的,只是给已经存在的东西赋值。
现在应该可以工作了,没有任何警告。
gg0vcinb2#
该警告是告诉您有一个您正在尝试设置的属性没有列在类的顶部。
当您运行此命令时:
它大致相当于:
警告是类定义中没有一行表示
$db->database
或$db->server
存在。现在,它们将被动态创建为非类型化公共属性,但是将来,您需要显式地声明它们:
在一些罕见的情况下,您实际上想要说“该类的属性是我决定在运行时添加的任何内容”;在这种情况下,可以使用
#[AllowDynamicProperties]
属性,如下所示:wpx232ag3#
另一种解决方案,它是特定于这个例子的,因为参数很容易识别。数据库有被引用的公共参数。
使用PHP 8命名参数和Constructor属性提升,允许您在构造函数中指定所有可能的参数(这有点冗长,但对代码完成很有帮助),然后在创建示例时,参数名称是固定的。
然后打电话给
xn1cxnb44#
通过将成员变量存储在单个数组中,可以避免指定成员变量的显式列表,如下所示:
然后,您可以使用所需的任何参数示例化
database
对象:当然,您可能希望记录所需的参数是什么,但至少可以传入任何您想要的参数,并且可以在将来使用它,而无需更改类定义。
6ss1mwsb5#
您看到的警告消息与PHP中名为"dynamic properties"的特性的使用有关。动态属性允许您通过使用变量名来设置和获取对象属性,就像您在数据库类的
__construct
方法中所做的那样。快速解决方案:
若要修复此警告,可以在代码中删除动态属性的使用,并使用更现代的方法设置对象属性。
命名参数:
或者,您也可以使用
__set
和__get
魔术方法来设置和获取对象属性,如下所示:这将允许您使用
$object->property
表示法来设置和获取对象属性,而不会触发警告消息。