Quelle est la meilleure façon de stocker PHP attributs de classe?
Doublon de: Quelle est la meilleure façon de stocker les variables de classe en PHP?
Pendant un certain temps, j'ai eu cette discussion avec un collègue sur la façon dont vous devez de stocker les attributs d'une classe PHP.
Alors, qui pensez-vous qu'il devrait être utilisé. Quelque chose comme ceci:
Class test{
public $attr1;
public $attr2;
..............
public function __construct(){
$this->attr1 = val;
$this->attr1 = val;
...................
}
}
Contre:
Class test{
public $data;
public function __construct(){
$this->data['attr1'] = val;
$this->data['attr2'] = val;
..........................
}
}
Ceci est important lorsque vous avez des objets avec de nombreux attributs qui doivent être stockées et récupérées dans souvent.
Également important lorsque vous traitez avec des objets avec de nombreux attributs, utilisez-vous des getters et setters pour chaque attribut ou plutôt une méthode pour définir tous et une méthode pour obtenir tous ?
Probablement un doublon de stackoverflow.com/questions/546403/...
C'est une bonne question, mais oui, c'est un doublon de l'autre. Droit de vote pour les fermer.
C'est une bonne question, mais oui, c'est un doublon de l'autre. Droit de vote pour les fermer.
OriginalL'auteur Brayn | 2009-04-30
Vous devez vous connecter pour publier un commentaire.
La Version 1 est la plus "classique" façon de faire les choses. Votre objet est à peu près exactement comme vous le dites c'est.
Je ne peux pas dire qui est strictement "mieux", mais je peux dire que je trouve plus pratique.
J'ai utilisé la deuxième version (généralement pour les modèles de base de données dans CodeIgniter, et en particulier au cours du développement précoce) en combinaison avec la coutume PHP5 getter et setter pour vous permettre de surcharge de la classe de façon dynamique. c'est à dire
OriginalL'auteur Chris
J'aimerais utiliser la deuxième version si et seulement si les données proviennent de sources externes (par exemple, BD de la requête). Dans ce cas, bien sûr il vous est conseillé d'avoir générique
__get()
/__set()
pour accéder à$this->data
. Vous pouvez également envisager la mise en œuvre de Interface IteratorAggregate retournew ArrayIterator($this->data)
.OriginalL'auteur vartec
Sauf si il y a vraiment des arguments convaincants pour les deux versions (depnding sur le contexte), j'ai toujours choisi le format le permet mon ide/outils de fournir de meilleures informations sur les types, classes, relations, ... et jusqu'à maintenant, c'est le premier format.
Il existe d'autres moyens pour accéder aux données du "tableau".
OriginalL'auteur VolkerK
La première méthode est à peu près standard. Il définit clairement ce que les propriétés sont, et permet IDEs de code et de documentation des outils pour ramasser disponibles sur les propriétés de l'objet.
La deuxième méthode est idéal pour la protection et la privé des propriétés de niveau dans lequel vous avez besoin de conserver les données dans un autre champ. Je utiliser une combinaison de ces deux approches dans différentes classes du modèle, ou pour suivre les options de configuration par défaut. Je serais toujours pré-remplir ces tableaux, cependant, et d'assurer le strict respect des données à l'intérieur.
Je ne voudrais pas défendre à l'aide de la seconde méthode pour un bien public, car il montre un manque de compréhension des propriétés de l'objet et de la portée des variables, et peuvent créer des problèmes dans le code (ce que si quelqu'un remplace la racine de tableau avec une chaîne de caractères?)
L'utilisation des accesseurs et mutateurs fait depuis sur les propriétés qui doivent être variable dans le code d'appel. Pas toutes les propriétés doivent être accessibles, c'est donc au développeur de définir l'objet. Les getter/setter modèle n'a pas de sens avec des propriétés publiques, évidemment, mais il le fait avec les propriétés protégées et privées qui peuvent avoir besoin d'une validation ou à désinfecter. Ils ont également un sens dans le contexte de l'injection de dépendance.
OriginalL'auteur Ryan Chouinard
personnellement j'utilise la version 1, parce que je pense que c'est plus correct, prend en charge l'auto-complétion dans IDEs et rend le débogage plus facile.
j'ai aussi utiliser les accesseurs et mutateurs pour presque toutes mes variables de membre (qui-je définir privé/protégé la plupart du temps), parce que la définition d'une valeur déclenche des changements dans d'autres valeurs très souvent. un des inconvénients de la création de g&s est la grande quantité de laid, stupide code qui s'accumule au fil du temps, si vous définissez des getters/setters même pour les attributs qui ne déclenchent pas de changements ailleurs. - je encore faire pour la cohérence de l'interface - je ne sais jamais quand je introduire des fonctionnalités supplémentaires ou des corrections de bugs qui introduisent plus de changements-sur-ensemble.
Si oui, vous devriez sans doute aller retour à procedual code 😉
OriginalL'auteur stefs
Je préfère la version 1, trop. Si vous n'avez pas besoin de membres dynamiques (la version de Chris fourni), vous devez définir vos membres. La dynamique conduit dans la plupart des cas d'un horrible construire qui rend difficile de comprendre votre code. Imaginez que quelqu'un aurait besoin de déboguer votre code et ne connaissez pas votre code ^^. Nous avons un grand projet qui utilise la dynamique membres de mettre en miroir les champs dans la table db. Son assez difficile à utiliser sans connaître la table.
À côté de la réalité, que votre IDE ne fonctionne pas avec dyn. membres, vous ne pouvez pas utiliser PHPDoc pour les membres ET PHPUnit ne peut pas utiliser la Réflexion sur ces attributs. C'est tout simplement mauvais style de codage.
Ce qui concerne,
Mario
OriginalL'auteur Mario Mueller
La raison pour utiliser la version 1 est que la version 2 prend place à l'intérieur de l'objet. Votre objet est déjà une carte de varnames de valeurs. En ajoutant votre propre arraymap vous ajoutez un inutile niveau d'indirection.
OriginalL'auteur jmucchiello
La meilleure méthode pour assurer le standard mais la seconde est bien sûr plus à l'aise....
Moi j'utilise le premier et j'utilise cette fonction à l'intérieur de la classe pour travailler dinamically:
Cette fonction vous retourne un tableau avec tous les attributs et la valeur d'une classe...
OriginalL'auteur Samuele