La création de propriétés dynamiques en PHP est obsolète : avertissement
P粉797855790
P粉797855790 2023-10-20 10:40:49
1
5
1010

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粉797855790
P粉797855790

répondre à tous(4)
P粉299174094

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 Ah, maître
    徐涛 auteur 2023-10-26 17:53:30
徐涛

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

P粉098979048

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

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal