我越來越多地看到這種情況,但我不確定需要做什麼來阻止此警告:
已棄用:建立動態屬性...已棄用
這是我的課:
class database { public $username = "root"; public $password = "password"; 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', ));
這給了我兩個訊息:
已棄用:建立動態屬性資料庫::$database 已棄用
已棄用:建立動態屬性資料庫::$server 已棄用
P粉2991740942023-10-21 10:14:38
該警告告訴您您嘗試設定的屬性未在類別頂部列出。
當您執行此命令時:
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', ));
大致相當於這樣:
class database { public $username = "root"; public $password = "pasword"; public $port = 3306; } $db = new database; $db->database = 'db_name'; $db->server = 'database.internal';
警告是類別定義中沒有行表示 $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', ));
在一些罕見的情況下,你實際上想說「這個類別的屬性是我決定在運行時添加的任何屬性」;在這種情況下,您可以使用#[AllowDynamicProperties]
屬性,如下圖所示:
#[AllowDynamicProperties] class objectWithWhateverPropertiesIWant { public function __construct($params = array()) { foreach ($params as $key => $value) { $this->{$key} = $value; } } }
P粉0989790482023-10-21 10:03:08
因此警告來自於新增動態類別屬性的建構子。如果您不必動態且真實地傳遞這些字段,那麼您似乎確實將簡單的事情變得過於複雜,那麼請像這樣嘗試。
class database { public $username = "root"; public $password = "pasword"; public $port = 3306; public $database = 'db_name'; public $server = 'database.internal'; } $db = new database();
您需要動態參數有什麼原因嗎?您也可以這樣做:
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; } } }
如果您提前新增參數,它們就不是動態的,您只是為已經存在的內容指派一個值。
現在應該可以正常工作,不會出現任何警告。
$db = new database(array( 'database' => 'db_name', 'server' => 'database.internal', ));