PHP: Comment Passer de l'enfant de la classe de __construct() arguments pour parent::__construct()?
J'ai une classe en PHP comme ceci:
class ParentClass {
function __construct($arg) {
//Initialize a/some variable(s) based on $arg
}
}
Il y a un enfant de la classe, en tant que tel:
class ChildClass extends ParentClass {
function __construct($arg) {
//Let the parent handle construction.
parent::__construct($arg);
}
}
Que si, pour une raison quelconque, le Myclass besoin de changer pour prendre plus d'un argument optionnel, qui je voudrais que mon Enfant en classe afin de fournir "au cas où"? À moins que je re-code de la ChildClass, il ne prendra jamais l'un argument au constructeur, et de ne passer qu'un seul argument.
Est-ce si rare ou une mauvaise pratique que le cas habituel est qu'un ChildClass n'auraient pas besoin d'être hérite d'un Myclass qui prend des arguments différents?
Essentiellement, je l'ai vu en Python où vous pouvez passer potentiellement un nombre indéterminé d'arguments à une fonction via somefunction(*args)
où 'args' est un tableau/objet iterable d'une certaine sorte. Fait quelque chose comme cela existe en PHP? Ou devrais-je refactoriser ces classes avant de poursuivre?
Vous devez vous connecter pour publier un commentaire.
Il y a quelque chose comme cela en php, bien qu'un peu verbeux:
call_user_func_array('parent::__construct', func_get_args());
;call_user_func_array()
en PHP 5.6 et jusqu'.Cela peut être fait en PHP >= 5,6 sans
call_user_func_array()
à l'aide de la...
(splat) opérateur:__construct()
variadic pour éviter d'avoir à appelerfunc_get_args()
? E. g.public function __construct(...$args) { parent::__construct(...$args); }
si vous obtenez php imbriquée limite d'erreur, essayez ceci:
Ma façon de faire (testé en PHP 7.1):
Tester https://3v4l.org/csJ68
Dans ce cas, le parent et l'enfant ont la même signature du constructeur.
Il fonctionne également si vous souhaitez décompresser vos arguments au constructeur parent:
Tester https://3v4l.org/JGE1A
Il est également intéressant de remarquer que dans le PHP >= 5.6 vous pouvez appliquer des types pour les variadic fonctions (types scalaires en PHP >= 7):
Découvrez ces fonctions sur php.net:
Aussi, si vous voulez faire un argument facultatif, vous pouvez le faire:
Oui, c'est plutôt une mauvaise pratique de faire un enfant de la classe qui utilise différents arguments du constructeur du parent. Surtout dans un langage comme PHP où il est mal pris en charge.
Bien sûr, la méthode générique permettant de passer d'un ensemble de "quels que soient les arguments que nous puissions jamais besoin" en PHP, c'est passer d'un argument unique composée d'une matrice de valeurs de configuration.
PHPStorm Inspection suggère d'utiliser l'argument de déballage de la fonction au lieu de call_user_func_array(). En dehors moins de la magie, la fonction est plus rapide.
Source: https://wiki.php.net/rfc/argument_unpacking