2009-02-13 7 views
8

J'ai actuellement mes variables de classe PHP mis en place comme ceci:Quelle est la meilleure façon de stocker des variables de classe en PHP?

class someThing { 

    private $cat; 
    private $dog; 
    private $mouse; 
    private $hamster; 
    private $zebra; 
    private $lion; 

    //getters, setters and other methods 
} 

Mais j'ai aussi vu des gens en utilisant un seul tableau pour stocker toutes les variables:

class someThing { 

    private $data = array(); 

    //getters, setters and other methods 
} 

qui utilisez-vous, et pourquoi? Quels sont les avantages et les inconvénients de chacun?

Répondre

11

Généralement, le premier est meilleur pour les raisons déjà mentionnées par d'autres personnes. Cependant, si vous avez besoin de stocker des données sur une classe en privé, mais que l'empreinte des membres de données est inconnue, vous verrez souvent votre 2ème exemple combiné avec des crochets __get() __set() pour masquer qu'ils sont en train d'être stocké en privé.

class someThing { 

    private $data = array(); 

    public function __get($property) 
    { 
     if (isset($this->data[$property])) 
     { 
      return $this->data[$property]; 
     } 
     return null; 
    } 

    public function __set($property, $value) 
    { 
     $this->data[$property] = $value; 
    } 
} 

Ensuite, les objets de cette classe peuvent être utilisés comme une instance de stdClass, seulement aucun des membres que vous définissez sont en réalité publique

$o = new someThing() 
$o->cow = 'moo'; 
$o->dog = 'woof'; 
// etc 

Cette technique a ses utilisations, mais il faut savoir que __get() et __set() sont de l'ordre de 10 à 12 fois plus lent que la définition directe des propriétés publiques.

6

Si vous utilisez private $data; vous avez juste une quantité de données impénétrable là-bas ... Les énoncer explicitement vous rendra la vie beaucoup plus facile si vous découvrez comment fonctionne une classe.

Une autre considération est si vous utilisez un IDE avec saisie semi-automatique - cela ne va pas fonctionner avec la 2ème méthode.

1

Si le code est répétitif, les tableaux et les boucles (foreach) sont rincés. Vous devez décider si le concept «animal» dans votre code est répétitif ou non, ou si le code doit se pencher sur l'unicité de chaque membre.

Si je dois me répéter plus d'une fois, je boucle.

0

Je préfère la première méthode, pour quelques raisons:

Dans un bon IDE, les propriétés de la classe apparaissent, même si privé/protégé Il est plus facile de voir ce qui a déjà été défini, ce qui réduit la chance que vous stocker la même information deux fois. Si le bus proverbial vous frappe sur le chemin du retour, il est beaucoup plus simple pour un autre développeur d'entrer et de lire votre code. Et bien qu'elle ne s'applique pas à la variable private, elle s'applique aux variables protégées, dans les classes qui étendent cette classe, vous devriez vraiment essayer d'éviter la seconde méthode pour une lisibilité pure.

En outre, en guise de remarque, je choisis presque toujours protégé sur privé, sauf si j'ai une raison très particulière de le rendre privé.

La seule fois où j'utiliserais probablement la seconde méthode était si je stockais une collection de plusieurs d'un genre de chose.

1
  • Utilisez la première méthode lorsque vous savez que vous avez besoin de cette variable.
  • Utilisez la seconde méthode (une collection de variables de tableau) lorsque vous avez des besoins de variables dynamiques.

Vous pouvez combiner ces deux méthodes, donc certaines variables sont codées en dur dans votre classe, tandis que d'autres sont dynamiques. Les variables codées en dur auront une préférence par rapport aux méthodes magiques.

Questions connexes