2012-06-07 15 views
5

Me preguntaba por qué tenemos que llamar explícitamente al constructor padre en PHP? ¿Qué ocurre si, digamos, olvidamos llamar al constructor padre en la clase derivada?¿Qué ocurre si no llamas al constructor padre explícitamente en PHP?

Pensé que la clase derivada no tendría acceso a las propiedades miembro o el método de su clase principal, pero después de intentar no llamar al constructor padre, parece que la clase hija todavía tiene acceso a su principal público/protegido miembro.

Entonces, ¿tenemos que llamar explícitamente a su constructor padre? ¿Cuáles son las consecuencias si olvidamos hacerlo?

Gracias de antemano. Cualquier tipo de ayuda será apreciada :)

+2

revise su manual http://php.net/manual/en/language.oop5.php – sephoy08

Respuesta

4

Depende de su código. En realidad, no ocurre nada si no llama al constructor padre, pero si su constructor padre hace algo inicializando para la clase padre, todo eso queda fuera. Consideremos, y jugar con esto:

<?php 

class X { 
    private $_a; 

    public function __construct($a) { 
     echo 'X::construct '; 
     $this->_a = $a; 
    } 

    public function getA() { 
     return $this->_a; 
    } 
} 

class Y extends X { 
    private $_b; 

    public function __construct($a,$b) { 
     echo 'Y::construct '; 
     parent::__construct($a); 
     $this->_b = $b; 
    } 

    public function getAB() { 
     return $this->_b + $this->getA(); 
    } 
} 

$n = new Y(3,2); 
echo $n->getAB(); 

Es fácil ver que si ejecuta este, imprime 5 (entre otras volcado). Pero si comenta class Y llamada principal parent::__construct($a);, obtiene 2. Esa es la consecuencia en este caso.

1

Las consecuencias realmente dependen de lo que ocurra en el constructor padre. Todas las propiedades y métodos de miembros públicos y protegidos están disponibles incluso cuando el constructor principal no se llama, eso es correcto. Pero los valores de los miembros de la clase heredados pueden modificarse/inicializarse en el constructor padre; tendrá que decidir si desea o no que eso suceda.

Normalmente es una buena decisión siempre agregar una llamada al constructor padre, incluso si no ocurre nada allí (que podría cambiar en el futuro). La única razón para omitir esta llamada es cuando necesita anular las acciones que se toman en el constructor. Esa es una característica que agrega más flexibilidad de la que tiene, p. en Java, donde invocar el constructor padre es obligatorio.

3

Porque los constructores padre no se invocan implícitamente si la clase secundaria define un constructor. Si la clase secundaria asume que el padre se ha inicializado y ha hecho algo de trabajo, debe asegurarse de que se ingrese el constructor padre.

Puede, por ejemplo, extender una clase en la que no quiere especificar el constructor padre. El comportamiento solo permite una mayor flexibilidad en el diseño. En la mayoría de los casos, usted probablemente desea llamar al constructor padre.

Todo depende de por qué extendió el padre. ¿Necesita métodos que requieren que el padre se inicialice? Si es así, llama a su constructor. ¿Puede inyectar ciertas dependencias específicas necesarias después de ampliarlas, o necesita cosas simples como constantes? Entonces probablemente no es necesario.

Cuestiones relacionadas