2010-02-23 7 views

Respuesta

94

No, no se llama al constructor de la clase primaria si la clase secundaria define un constructor.

Desde el constructor de la clase hija, tiene que llamar al constructor de la clase de los padres:

parent::__construct(); 

pasándole parámetros, si es necesario.

Generalmente, lo hará al principio del constructor de la clase secundaria, antes de cualquier código específico; lo que significa, en su caso, tendría que:

class Child extends Base { 
    function __construct() { 
     parent::__construct(); 
     echo 'Child __construct<br/>'; 
    } 
} 


Y, como referencia, se puede echar un vistazo a esta página del manual de PHP: Constructors and Destructors - afirma (citando):

Nota: constructores padres no son llamados implícitamente si la clase hijo define un constructor .
Para ejecutar un constructor principal, se requiere una llamada a parent::__construct() dentro del constructor hijo .

+1

No indican explícitamente esto pero implican que si la clase secundaria no tiene un constructor, se llamará al constructor padre. ¿Es eso cierto? – andrew

+9

Sí: si la clase secundaria no define un constructor, la primaria no se sobrescribe y, por lo tanto, se llama ;;; citando el manual: Los constructores principales no son llamados implícitamente ** si la clase hija define un constructor **. –

+0

@PascalMARTIN Gracias, estaba buscando intentando verificar eso. Hizo un poco de búsqueda. –

5

Bueno, acabo de encontrar esto en el docs:

Nota: Los constructores padres no son llamada implícita si la clase hijo define un constructor . Para ejecutar un constructor principal, se requiere una llamada a parent :: __ construct() dentro del constructor secundario.

+1

La razón principal por la que escribo un constructor en una clase abstracta es para exigir que cada clase que herede de esta clase ejecute el código especificado. Es una verdadera lástima PHP hace que la ejecución del constructor sea opcional. –

+2

@RyanWilliams Hay casos en los que necesita llamar al constructor padre antes de hacer una inicialización adicional en clase y hay casos en los que se llama al padre después de las inicializaciones adicionales. Por lo tanto, PHP también le permite admitir más casos de uso. – Nux

1

Si necesita el mismo comportamiento como C#, que es el constructor de los padres obtiene siempre se ejecuta antes de constructor de niño, usted podría crear una clase constructora falsa para sus clases hijas y la declara como una función resumen en su clase padre abstracta .

E.g.

abstract class Test{ 
    abstract public function __childconstruct(); 
    public function __construct(){ 
    echo "SOME CODE".PHP_EOL; 
    $this->__childconstruct(); 
    } 
} 

class TestExtended extends Test{ 
    public function __childconstruct(){ 
    echo "SOME OTHER CODE FROM EXTENDED CLASS".PHP_EOL; 
    } 
} 

$a = new TestExtended(); 

/* SOME CODE 
    SOME OTHER CODE FROM EXTENDED CLASS */ 
Cuestiones relacionadas