Как автоматически запустить конструкцию в родительском классе без вызова из дочернего класса - PullRequest
6 голосов
/ 22 июня 2011

Я ищу способ автоматического вызова конструктора родительского класса (?) Из дочернего класса:

(Примечание: это только пример, поэтому могут быть ошибки при наборе)

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' ) */

Чего я хочу избежать, так это вызова (внутри класса myChild) __construct( $args ) { parent::__construct( $args ); }.

Вопрос: возможно ли это? Если так: как?

Спасибо!

Ответы [ 2 ]

9 голосов
/ 22 июня 2011

В вашем примере кода конструкция myParent :: __ уже будет вызываться при создании myChild. Чтобы ваш код работал так, как вы хотите, просто измените

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

по

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

Пока myChild не имеет конструктора , родительский конструктор будет вызываться / наследоваться.

5 голосов
/ 22 июня 2011

Поскольку Child не имеет конструктора и расширяется Parent, в любое время, когда указано new Child(), конструктор Parent будет неявно вызываться.

Если вы укажете конструктор Child, вы должны будете использовать указать parent::__construct(); внутри конструктора Child, так как он не будет вызываться неявно.

NB При определении конструктора в подклассе рекомендуется вызывать parent::__construct() в первой строке определения метода, чтобы любые параметры экземпляра и унаследованное состояние устанавливались до инициации подкласса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...