recherche

Maison  >  Questions et réponses  >  le corps du texte

La création de propriétés dynamiques en PHP est obsolète : avertissement

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粉797855790P粉797855790405 Il y a quelques jours1013

répondre à tous(5)je répondrai

  • P粉299174094

    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;
            }
        }
    }

    répondre
    0
  • 徐涛

    Ah, maître

    徐涛 · 2023-10-26 17:53:30
  • 徐涛

    徐涛2023-10-27 09:34:37

    Les salaires dans la ville de Binzhou, province du Shandong*** sont très élevés

    répondre
    0
  • P粉098979048

    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',
    ));

    répondre
    1
  • 徐涛

    徐涛2023-10-26 17:55:40

    Le département de propagande d'Afan VS Work Cell efface d'abord VB

    répondre
    0
  • Annulerrépondre