2011-06-22 4 views
6

子クラスから呼び出しなし親クラスの自動実行構築物と(?):どのように私は自動魔法の子クラスから親クラスのコンストラクタを呼び出すための方法を探しています

(注:これは私は避けたいのは(__construct($args) { parent::__construct($args); })クラスはmyChildの内側を呼び出すために持っている

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

)ので、エラーが存在することができる入力して、単なる一例です。

質問:これは可能ですか?もしそうなら:どのように?

ありがとうございます! Childとして

+0

なぜあなたは 'parent :: __ construct()'を呼び出すことに反対していますか? – cspray

+1

私はPHPも魔法のように私のアプリケーションを記述したいと思います。 –

+0

@Wesley van Opdorp解決策をご覧ください。私のために働く。 @Charles Sprayberry私は未知数の子クラスによって拡張された基本クラスを持っているので、すべての入力引数(無効な入力の破棄、デフォルトの解析など)に対して標準のプロシージャを実行する必要があります – kaiser

答えて

9

サンプルコードでは、myParent :: __構文はすでにmyChildをインスタンス化して呼び出されます。あなたは、単に限りはmyChildは何のコンストラクタを持っていないとして、親コンストラクタは継承/呼び出されます

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

によって

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

を変えたいよう はあなたのコードが動作するように取得します。

+0

パーフェクト。 +1。私はそれをクラスにドロップすることができず、親のコンストラクタが呼び出されることは知られていません。ありがとうございました – kaiser

+1

助けてくれる;) – malko

+0

'myChildにコンストラクタがない限り、親コンストラクタは/ inherited.'と呼ばれます。私は何が起こっているかを完全に記述しているこの簡単なステートメントを見つけるために多くを探しました! – Sliq

5

は、コンストラクタの存在がなく、Parentを拡張し、任意の時間new Child()Parentコンストラクタが呼び出さ暗黙あろう指定されています。 コンストラクタを指定する場合は、コンストラクタ内にparent::__construct();という指定を使用する必要があります。暗黙的に呼び出されることはないためです。

N.Bそれは任意のインスタンス・パラメータおよび状態を継承するようにメソッド定義の最初の行にparent::__construct()を呼び出すためのベストプラクティスは、開始をサブクラス化する前に設定されているサブクラスでコンストラクタを定義します。

関連する問題