2008-12-23 9 views
0

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?

Répondre

4

Non. Il n'y a pas de meilleur moyen que __set dans une classe de base - pour le moment. Ce problème est connu et est planned to be addressed in the future:

Initiez concept de « classes strictes » qui ne permettent pas la création de propriété dynamique

0

Je dois vous demander pourquoi vous devez faire cela? Si un membre est assigné et n'existe pas, cela n'affecte pas les méthodes, et s'il est privé, il enverra une erreur. Alors pourquoi avez-vous besoin de faire cela, ou ai-je complètement mal interprété la question?

+0

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

+0

... 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

+0

Cela peut affecter la sérialisation. – jmucchiello

2

Nop, uniquement __set. Peut-être pouvez-vous utiliser l'héritage pour éviter de le réécrire partout.

Questions connexes