Qui est la meilleure approche pour initialiser php propriétés?
Voici deux d'initialiser des variables de classe.
1ère Méthode
class Test {
private $var1;
private $var2;
public function Test($var1,$var1) {
$this->var1 = $var1;
$this->var2 = $var2;
}
}
$objTest = new Test("value1","value2");
2ème Méthode
class Test {
private $var1;
private $var2;
public function _set($var, $value) {
$this->$$var = $value
}
}
$objTest = new Test();
$objTest->_set('var1','value1');
$objTest->_set('var2','value2');
Maintenant, ces deux méthodes sont valables, mais je voudrais savoir lequel de mieux dans quelles conditions? Quels sont les avantages et les inconvénients de s'en tenir à une seule?
- Vous ne semblez pas avoir bien saisi le concept de constructeurs.
- oui un peu comme ça. @BoltClock, je comprends les concepts de constructeurs assez bien, mais je demande à la classe d'initialisation de variable et de méthodes.
- BTW, la Terminologie: En programmation orientée objet, un variable de Classe est un
static
membre d'une classe; il n'est qu' un la valeur d'une "variable de classe", partagé par toutes les instances de cette classe. Ce que vous montrez sont les variables d'Instance, qui en php sont appelés propriétés.
Vous devez vous connecter pour publier un commentaire.
Dans votre exemple, la deuxième méthode est très risqué. Si vous donnez le nom de la variable comme argument, fondamentalement, vous donner le code de l'accès à l'ensemble de toutes les variables privées de l'extérieur de la classe. Quel est l'intérêt d'avoir des variables privées si vous leur permettez d'être fixé librement comme ça?
En outre, le point de l'encapsulation dans la POO, c'est que le fonctionnement interne d'une classe ne sont pas transparentes pour le code en dehors de la classe. Votre deuxième méthode rompt cette encapsulation et, par conséquent, le point de la programmation orientée objet, comme le code en dehors de la classe a à connaître tous les rouages de la classe, comme le nom des variables. Qu'advient-il si vous décidez plus tard de changer les noms de variable? Tous les code les sauts. Si elles étaient accessibles via des setters/getters, anciennes fonctions pourraient être modifiés afin de refléter les changements à l'intérieur de la classe, mais le code en dehors de la classe serait difficile de changer. En outre, la deuxième méthode permet la validation des valeurs dur.
Vous devez utiliser la première méthode, surtout si la définition de la classe des variables est nécessaire pour le fonctionnement. Toutefois, si vous pensez que certaines valeurs par défaut peuvent être autorisés pour les attributs, vous pouvez simplement profiter de PHP par défaut de l'argument des valeurs comme:
De toute façon, si les valeurs doivent être initialisés par le code, alors vous devriez certainement de les forcer à être passé dans le constructeur. Si les valeurs par défaut sont autorisées, soit initialiser les valeurs constructeur de séparer les setters pour les variables ou à la juste valeur par défaut des arguments comme dans l'exemple fourni. Il est, cependant, les mauvaises pratiques d'attendre le code de valeurs critiques via les setters après le constructeur.
Si ces variables sont nécessaires pour le fonctionnement de la classe, vous beter utiliser la première méthode. De cette façon vous pouvez vous assurer qu'elles sont quand la classe est créée.
Je me demande pourquoi vous avez défini vos variables comme privé dans la première place. Privé de l'existence des membres de la classe elle-même plutôt que pour une utilisation via une interface publique. Il peut garder la trace de certains de la valeur, de la magie setter (méthode__set) peut modifier, à tout moment dans le programme, comme vous l'avez dans votre deuxième exemple. Si vous avez besoin de vos variables privées (pour la classe seulement l'accès), puis un constructeur function __construct($var1,$var2) ou __construct($var1="defaultvalue",$var2="defaultvalue"), donc en accord avec votre premier exemple.
Cela dépend de votre prévus états, ce qui vous aurait prévu dans l'état/activtiy diagrammes.
Espère que ça aide
À propos de cet
$x=$var1
, ne pas attribuer de la valeur àpublic $x
. Et quand vous le corriger, il sera similaire à @Rinuwise réponse$x
,$y
) travail dans une classe. Vous êtes à la pensée du problème de la référence àglobal $x
dans une fonction. Pas le même.Mon esprit est que vous devez combiner les deux méthodes.
Propriétés qui sont inévitables doivent être présents dans une construction de la méthode.
Pour les propriétés qui sont en option, vous devez définir la valeur par défaut dans la construction puis de créer des getter/setter.
Et vous pouvez créer de multiples construire des méthodes comme pour la base de données, en général, vous avez:
Puis dans le "bas" de construire, vous aurez mis
$options
puis d'appeler le "haut" de construire qui va définir la$port
et appellera le "haut" de construire... etc...PHP
tag, mais il a fait le point 😀