Rumah > Soal Jawab > teks badan
Saya semakin banyak melihat perkara ini, tetapi saya tidak pasti apa yang perlu dilakukan untuk menghentikan amaran ini:
DILARANG: Mencipta sifat dinamik... DILARANG
Ini kelas saya:
class database { public $username = "root"; public $password = "password"; public $port = 3306; public function __construct($params = array()) { foreach ($params as $key => $value) { $this->{$key} = $value; } } }
Beginilah cara saya membuat seketika.
$db = new database(array( 'database' => 'db_name', 'server' => 'database.internal', ));
Ini memberi saya dua mesej:
DILARANG: Cipta pangkalan data sifat dinamik::$database Ditamatkan
DILARANG: Cipta pangkalan data sifat dinamik::$server Ditamatkan
P粉2991740942023-10-21 10:14:38
Amaran ini memberitahu anda bahawa harta yang anda cuba tetapkan tidak disenaraikan di bahagian atas kelas.
Apabila anda menjalankan arahan ini:
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', ));
kira-kira bersamaan dengan ini:
class database { public $username = "root"; public $password = "pasword"; public $port = 3306; } $db = new database; $db->database = 'db_name'; $db->server = 'database.internal';
Amarannya ialah tiada baris dalam definisi kelas yang menunjukkan bahawa $db->database
或 $db->server
wujud.
Pada masa ini, ia dicipta secara dinamik sebagai harta awam yang tidak ditaip, tetapi pada masa hadapan, anda perlu mengisytiharkannya secara eksplisit:
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', ));
Dalam beberapa kes yang jarang berlaku, anda sebenarnya ingin mengatakan "sifat kelas ini ialah apa jua sifat yang saya putuskan untuk tambah semasa masa jalan"; dalam kes itu, anda boleh menggunakan atribut #[AllowDynamicProperties]
seperti ini:
#[AllowDynamicProperties] class objectWithWhateverPropertiesIWant { public function __construct($params = array()) { foreach ($params as $key => $value) { $this->{$key} = $value; } } }
P粉0989790482023-10-21 10:03:08
Jadi amaran datang daripada pembina yang menambah sifat kelas dinamik. Nampaknya anda membuat sesuatu yang mudah terlalu rumit jika anda tidak perlu melepasi medan secara dinamik dan tulen, jadi cuba sesuatu seperti ini.
class database { public $username = "root"; public $password = "pasword"; public $port = 3306; public $database = 'db_name'; public $server = 'database.internal'; } $db = new database();
Adakah ada sebab mengapa anda memerlukan parameter dinamik? Anda juga boleh melakukan ini:
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; } } }
Jika anda menambah parameter lebih awal daripada masa, ia tidak dinamik, anda hanya memberikan nilai kepada sesuatu yang sudah ada.
Ia sepatutnya berfungsi tanpa sebarang amaran.
$db = new database(array( 'database' => 'db_name', 'server' => 'database.internal', ));