2011-06-22 8 views
6

Estoy buscando una manera de llamar a un constructor de la clase padre de auto-mágicamente de una clase hija (?):Cómo Autorun construcción en la clase padre sin llamada de clase hija

(Nota: Este es sólo un ejemplo, por lo que los errores de escritura puede estar presente)

Class myParent() 
{ 
    protected $html; 

    function __construct($args) 
    { 
     $this->html = $this->set_html($args); 
    } 

    protected function set_html($args) 
    { 
     if ($args['foo'] === 'bar') 
      $args['foo'] = 'foobar'; 
     return $args; 
    } 
} 

Class myChild extends myParent 
{ 
    public function do_stuff($args) 
    { 
     return $this->html; 
    } 
} 

Class myInit 
{ 
    public function __construct($args) 
    { 
     $this->get_stuff($args); 
    } 

    public function get_stuff($args) 
    { 
     $my_child = new myChild(); 
     print_r($my_child->do_stuff($args)); 
    } 
} 

$args = array('foo' => 'bar, 'what' => 'ever'); 
new myInit($args); 

// Should Output: 
/* Array('foo' => 'foobar', 'what' => 'ever') */ 

Lo que quiero evitar es tener que llamar al (dentro de la clase Mi hijo) __construct($args) { parent::__construct($args); }.

Pregunta: ¿Es esto posible? ¿Si es así, cómo?

Gracias!

+0

¿Por qué te opones a llamar 'parent :: __ construct()'? – cspray

+1

Me gustaría que PHP también escriba mágicamente mi aplicación. –

+0

@Wesley van Opdorp Por favor, vea la solución. Funciona para mi. @Charles Sprayberry Obtuve una clase base que se amplía por un número desconocido de clases secundarias y, por lo tanto, tengo que ejecutar un procedimiento estándar para todos los argumentos de entrada (como eliminar entradas no válidas, analizar los valores predeterminados, etc.) – kaiser

Respuesta

9

En su código de ejemplo, myParent :: __ construct ya se llamará wen instanciando myChild. para obtener su código funcione como desee simplemente cambiar

public function get_stuff($args) 
{ 
    $my_child = new myChild(); 
    print_r($my_child->do_stuff($args)); 
} 

por

public function get_stuff($args) 
    { 
     $my_child = new myChild($args); 
     print_r($my_child->do_stuff()); 
    } 

Mientras Mi hijo no tiene constructor, el constructor padres serán llamados/heredada.

+0

Perfecto. +1. No he sabido que puedo colocarlo en la clase y se llama al constructor padre. Gracias – kaiser

+1

contento de ayudar;) – malko

+0

'Mientras myChild no tenga un constructor, el constructor padre se llamará/heredará. ¡Muchas gracias! ¡He buscado mucho para encontrar esta simple declaración que describe perfectamente lo que está pasando! – Sliq

5

Como Child no tiene constructor presente y extiendeParent, en cualquier momento new Child() se especifica el Parent constructor será implícitamente llama.

Si especifica un constructor Child, debe usar especificar parent::__construct(); dentro del constructor Child ya que no se invocará implícitamente.

N.B Cuando se define un constructor en una subclase es la mejor práctica para llamar parent::__construct() en la primera línea de la definición del método para que los parámetros de instancia y estado heredado se establece antes de la subclase iniciación.

Cuestiones relacionadas