En PHP, si vous définissez une classe, puis instanciez un objet de cette classe, il est possible d'ajouter ultérieurement arbitrairement de nouveaux membres à cette classe. Par exemple:Verrouillage des membres de la classe dans PHP
class foo {
public $bar = 5;
}
$A = new foo;
$A->temp = 10;
Cependant, je voudrais pouvoir rendre impossible l'ajout de nouveaux membres de cette façon. Fondamentalement, je veux que la classe a UNIQUEMENT les membres qui sont spécifiés dans sa définition; Si vous essayez de définir d'autres membres, c'est fatalement des erreurs. L'intention ici est que je veux définir une classe comme un ensemble très spécifique de propriétés, et que seules ces propriétés existent dans la classe, afin que le contenu de la classe soit bien défini et ne puisse pas changer plus tard (les valeurs de chaque membre peut changer, mais pas les membres eux-mêmes). Je réalise que je peux le faire avec la méthode __set, et j'ai simplement une erreur fatale si vous essayez de définir un membre qui n'existe pas déjà, mais c'est ennuyeux d'avoir à inclure dans chaque définition de classe (bien que je puisse définissez chacune de mes classes pour étendre une classe de base avec cette méthode, mais c'est aussi ennuyeux). E.g .:
class foo {
public $bar = 5;
private function __set($var, $val) {
trigger_error("Cannot dynamically add members to a class", E_USER_ERROR);
}
}
Existe-t-il un autre moyen (de préférence plus pratique) de le faire? Mis à part modifier PHP lui-même pour interdire ce comportement?
En termes étroits, je veux éviter la possibilité de fautes de frappe membres. Imaginez une classe avec une propriété nommée $ char_lists, puis quelqu'un fait $ Object-> chr_lists = array (1, 2, 3). Il aurait échoué silencieusement et serait ennuyeux de traquer. Ou, quelqu'un peut ajouter une nouvelle propriété et l'utiliser, mais alors ... – dirtside
... d'autres personnes qui modifient ce code plus tard ne comprennent pas d'où vient cette variable mystérieuse ni à quoi elle sert, car ce n'est pas dans la définition de classe. Les classes doivent être exactement comme définies dans la définition de classe. – dirtside
Cela peut affecter la sérialisation. – jmucchiello