sobrecarga que overload ejemplos constructores __construct php inheritance constructor

que - PHP: ¿Cómo pasar los argumentos de clase secundaria__construct() a parent::__ construct()?



que es un constructor en php (7)

Tengo una clase en PHP así:

class ParentClass { function __construct($arg) { // Initialize a/some variable(s) based on $arg } }

Tiene una clase infantil, como tal:

class ChildClass extends ParentClass { function __construct($arg) { // Let the parent handle construction. parent::__construct($arg); } }

¿Qué sucede si, por alguna razón, ParentClass necesita cambiar para tomar más de un argumento opcional, que me gustaría que mi clase Child proporcione "por las dudas"? A menos que vuelva a codificar el ChildClass, solo tomará el único argumento para el constructor, y solo pasará ese único argumento.

¿Es esto tan raro o una mala práctica que el caso habitual es que una ChildClass no necesitaría heredar de un ParentClass que toma diferentes argumentos?

Esencialmente, he visto en Python donde puedes pasar una cantidad de argumentos potencialmente desconocida a una función a través de somefunction(*args) función somefunction(*args) donde ''args'' es una matriz / iterable de algún tipo. ¿Algo como esto existe en PHP? ¿O debería refactorizar estas clases antes de proceder?


Esto se puede hacer en PHP> = 5.6 sin call_user_func_array() usando el operador ... (splat) :

public function __construct() { parent::__construct(...func_get_args()); }


Hay algo como esto en php, aunque un poco detallado:

$args = func_get_args(); call_user_func_array(array($this, ''parent::__construct''), $args);


Mi forma de hacerlo (probado en PHP 7.1):

class ParentClass { public function __construct(...$args) { print ''Parent: '' . count($args) . PHP_EOL; } } class ChildClass extends ParentClass { public function __construct(...$args) { parent::__construct(...$args); print ''Child: '' . count($args). PHP_EOL; } } $child = new ChildClass(1, 2, 3, new stdClass); //Output: //Parent: 4 //Child: 4

Pruébelo https://3v4l.org/csJ68

En este caso, el padre y el hijo tienen la misma firma de constructor. También funciona si desea descomprimir sus argumentos en el constructor padre:

class ParentClass { public function __construct($a, $b, $c, $d = null) { print ''Parent: '' . $a . $b . $c . PHP_EOL; } } class ChildClass extends ParentClass { public function __construct(...$args) { parent::__construct(...$args); } } $child = new ChildClass(1, 2, 3); //Output: Parent: 123

Pruébelo https://3v4l.org/JGE1A

También vale la pena notar que en PHP> = 5.6 puede aplicar tipos para funciones variadas (tipos escalares en PHP> = 7):

class ParentClass { public function __construct(DateTime ...$args) { //Do something } }


Sí, es una práctica bastante mala crear una clase hija que use diferentes argumentos de constructor del padre. Especialmente en un lenguaje como PHP donde tiene poco soporte.

Por supuesto, la forma genérica de pasar un conjunto de "cualquier argumento que podamos querer" en PHP es pasar un único argumento que consiste en una matriz de valores de configuración.


Vea estas funciones en php.net:

func_get_args func_num_args

Además, si desea hacer un argumento opcional, puede hacer esto:

class ParentClass { function __construct($arg, $arg2="Default Value") { // Initialize a/some variable(s) based on $arg } }


si obtiene un error de límite anidado php, intente esto:

$args = func_get_args(); call_user_func_array(array(''parent'', ''__construct''), $args);


parent::__construct( func_get_args() );