Les meilleures pratiques, en substituant __construct() rapport fournissant méthode init()
Lorsque vous êtes sous-classement d'objets et que vous voulez étendre le code d'initialisation, il y a deux approches. Primordial __construct(), et la mise en œuvre d'une méthode d'initialisation de votre constructeur de la superclasse des appels.
Méthode 1:
class foo
{
public function __construct ($arg1, $arg2, $arg3)
{
//Do initialization
}
}
class bar extends foo
{
public function __construct ($arg1, $arg2, $arg3)
{
parent::__construct ($arg1, $arg2, $arg3);
//Do subclass initialization
}
}
Méthode 2
class foo
{
public function init ()
{
//Dummy function
}
public function __construct ($arg1, $arg2, $arg3)
{
//Do subclass defined initialization
$this -> init ();
//Do other initialization
}
}
class bar extends foo
{
public function init ()
{
//Do subclass initialization
}
}
La documentation pour le Zend Framework semble décourager primordial constructeurs et veut que vous le remplacer init méthodes, le cas échéant, mais ce en quelque sorte ne fonctionne tout simplement pas pour moi. Zend a aussi tendance à faire quelques petites choses que je ne suis pas heureux avec donc je ne sais pas si elle devrait être utilisée comme un exemple de meilleure pratique. Personnellement, je pense que la première approche est la bonne, mais j'ai vu la deuxième approche assez souvent pour me demander si c'est réellement ce que je devrais faire.
Avez-vous des commentaires au sujet primordial __construct? Je sais que vous devez être prudent de se rappeler d'invoquer le constructeur de la superclasse, mais la plupart des programmeurs doivent en être conscients.
EDIT:
Je ne suis pas à l'aide de Zend, je suis le seul à l'utiliser comme un exemple de code qui vous encourage à utiliser la fonction init() au lieu de l'annulation de __construct().
Vous devez vous connecter pour publier un commentaire.
Ressemble à la deuxième approche est reporter le problème.
Si vous avez une classe:
Je pencherais pour la première approche, plus logique et simple, car la
parent::init()
ouparent::__construct()
appel ne peut pas être sans cesse à éviter. La première approche, l'OMI, est moins déroutant.Les deux seules situations, je pense, dans laquelle il est judicieux d'utiliser
init()
, c'est quand votre constructeur est non-public, mais vous avez besoin de donner aux gens une chance de l'influence de l'initialisation, par exemple, dans un résumé Singleton (que vous ne souhaitez pas utiliser de toute façon). Ou, comme dans le Zend Framework, quand supplémentaires l'initialisation doit être différée (mais alors, vous ne l'appelez pasinit()
à partir du constructeur).L'appel d'une méthode dans une sous-classe de la classe mère est appelée Méthode De Modèle, par la manière. Le cas d'utilisation serait pour orchestrer un certain flux de travail, mais de permettre au sous-type à l'influence des parties. Cela se fait généralement à partir des méthodes régulières si. Notez que votre constructeur ne devrait pas orchestrer rien mais juste initialiser l'objet dans un état valide.
Vous avez certainement devraient pas appel d'offre
init()
à partir du constructeur pour éviter aux développeurs d'avoir à penser à appeler le supertype constructeur. Bien que cela puisse paraître pratique, il sera rapidement gâcher la hiérarchie d'héritage. Notez également qu'il s'écarte de la manière dont les objets sont généralement initialisé et que les développeurs ont à apprendre ce nouveau comportement, tout comme ils doivent apprendre à appeler le supertype du constructeur.Tout d'abord
Vous pouvez résoudre ce problème simplement, en ne l'utilisant pas.
Mais deuxièmement, et plus important encore, vous devez remplacer
init()
et pas__construct()
parce queinit()
fait partie de l'expédition opération qui utilise Zend et de l'aide il s'assure que le reste de votre Application est là et bien en place. Sinon, brise le flux de Zend MVC du modèle et peut entraîner des comportements bizarres.Modifier
Je pense que la raison principale pour moi est qu'il s'arrête d'autres développeurs de violon. Vous pouvez faire n'importe quoi avec
init()
mais pas avec__construct()
que ce besoin pour fonctionner correctement avec tous les params en place.C'est à partir du Zend Docs:
Je voudrais utiliser la fonction init parce que si vous surcharger le constructeur vous (normalement) faut pas oublier d'appeler le constructeur parent à la tête de votre enfant du constructeur de la classe. Alors que vous pourriez être conscient de cela, vous ne pouvez pas garantir qu'un autre développeur chargé de maintining votre application sera.
Je peux voir l'un des avantages de l'utilisation
init()
au lieu de__construct()
: si la signature des changements dans le constructeur, vous devez mettre à jour tous les dérivés de la classe pour correspondre à la nouvelle signature.Si
init()
n'a pas de paramètre, cela n'arrivera pas.