Maison > Questions et réponses > le corps du texte
Je vois cela de plus en plus, mais je ne suis pas sûr de ce qu'il faut faire pour arrêter cet avertissement :
OBSCURÉ : Création de propriétés dynamiques... OBSCURÉ
Voici mon cours :
class database { public $username = "root"; public $password = "password"; public $port = 3306; public function __construct($params = array()) { foreach ($params as $key => $value) { $this->{$key} = $value; } } }
C'est ainsi que je l'instancie.
$db = new database(array( 'database' => 'db_name', 'server' => 'database.internal', ));
Cela me donne deux messages :
OBSCURÉ : Créer une base de données de propriétés dynamiques ::$database Obsolète
OBSERVÉ : Créer une base de données de propriétés dynamiques ::$server Obsolète
P粉2991740942023-10-21 10:14:38
Cet avertissement vous indique que la propriété que vous essayez de définir n'est pas répertoriée en haut de la classe.
Lorsque vous exécutez cette commande :
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', ));
à peu près équivalent à ceci :
class database { public $username = "root"; public $password = "pasword"; public $port = 3306; } $db = new database; $db->database = 'db_name'; $db->server = 'database.internal';
L'avertissement est qu'il n'y a aucune ligne dans la définition de classe indiquant que $db->database
或 $db->server
existe.
Actuellement, ils sont créés dynamiquement en tant que propriétés publiques non typées, mais à l'avenir, vous devrez les déclarer explicitement :
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', ));
Dans certains cas rares, vous souhaitez réellement dire « les propriétés de cette classe sont les propriétés que je décide d'ajouter au moment de l'exécution » ; dans ce cas, vous pouvez utiliser l'attribut #[AllowDynamicProperties]
comme ceci :
#[AllowDynamicProperties] class objectWithWhateverPropertiesIWant { public function __construct($params = array()) { foreach ($params as $key => $value) { $this->{$key} = $value; } } }
徐涛2023-10-27 09:34:37
Les salaires dans la ville de Binzhou, province du Shandong*** sont très élevés
P粉0989790482023-10-21 10:03:08
L'avertissement vient donc du constructeur qui ajoute des propriétés de classe dynamiques. Il semble que vous fassiez quelque chose de simple et trop complexe si vous n'avez pas besoin de transmettre les champs de manière dynamique et authentique, alors essayez quelque chose comme ceci.
class database { public $username = "root"; public $password = "pasword"; public $port = 3306; public $database = 'db_name'; public $server = 'database.internal'; } $db = new database();
Y a-t-il une raison pour laquelle vous avez besoin de paramètres dynamiques ? Vous pouvez également faire ceci :
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; } } }
Si vous ajoutez des paramètres à l'avance, ils ne sont pas dynamiques, vous attribuez simplement une valeur à quelque chose qui existe déjà.
Cela devrait maintenant fonctionner sans aucun avertissement.
$db = new database(array( 'database' => 'db_name', 'server' => 'database.internal', ));