2011-06-22 49 views
6

我在尋找一種方法來調用父類的構造從子類自動神奇(?):如何在父類中自動運行結構,而不調用從子類

(注:這僅僅是一個例子,所以輸入錯誤可能存在)

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); }

問題:這可能嗎?如果是這樣:如何?

謝謝!

+0

你爲什麼反對調用'parent :: __ construct()'? – cspray

+1

我想PHP也奇蹟般地寫我的應用程序。 –

+0

@Wesley van Opdorp請參閱解決方案。適用於我。 @Charles Sprayberry我有一個基類,它被未知數量的子類所擴展,因此我必須爲所有輸入參數運行標準程序(例如,丟棄無效輸入,解析默認值等)。 – kaiser

回答

9

在您的示例代碼中,myParent :: __構造已經被稱爲wen instanciating 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)); 
} 

只要myChild沒有構造,父構造函數將被調用/繼承。

+0

完美。 +1。我不知道我可以將它放到類中,並且可以調用父構造函數。謝謝 – kaiser

+1

很樂意幫忙;) – malko

+0

'只要myChild沒有構造函數,父構造函數將被調用/繼承.'謝謝sooo!我已經搜索了很多,找到這個簡單的描述,完全描述發生了什麼! – Sliq

5

作爲Child沒有本構造和延伸Parent,任何時間new Child()指定了Parent構造將是隱含調用。

如果您確實指定了Child構造函數,則必須在Child構造函數中指定parent::__construct();,因爲它不會隱式調用。

N.B當定義在子類中構造它是調用parent::__construct()使得,任何實例參數和繼承的狀態是子類開始之前設定的方法定義的第一行的最佳做法。

相關問題