2014-11-06 109 views
1

我不是很好,但在PHP語法,所以這裏是我的問題:PHP的子類構造函數調用父對象作爲參數

我有一個類Foo。

Class Bar延伸Foo。

我想爲Bar創建一個構造函數,並將其作爲類Foo的一個實例作爲參數調用,並創建一個Bar實例,該實例看起來就像Foo類的實例。

看來我必須這樣做,因爲Foo是WordPress插件中的一個類。我正在編寫一個插件來放在原始插件的頂部,並且在我可以添加的過濾器中,我得到了Foo對象。

如果我可以學習「正確」的方法來做到這一點,我就會以「正確」的方式做到這一點。

這樣:

class Foo {  // in the original plugin 
    public function __construct() { 
     <do some stuff> 
    } 
} 

class Bar extends Foo {  // in my plugin to extend the original plugin 
    public function __construct($myFooObject) { 
     <I want: $this = $myFooObject; but it doesnt work> 
     <do some stuff special to Bar> 
    } 
} 
+0

bar正在擴展foo,所以它已經成爲foo的一個實例。它恰好在頂部疊加了額外的條形碼。 – 2014-11-06 19:07:38

+0

我不知道我明白你想做什麼,但你可能想看看[parent ::](http://php.net/manual/en/keyword.parent.php)。馬克所說的絕對是正確的。 – vcanales 2014-11-06 19:10:12

+0

這本PHP手冊有一個真正簡單的概述,你正在問什麼。這是一個鏈接到它的文檔 - http://php.net/manual/en/language.oop5.decon.php – 2014-11-06 19:10:24

回答

0
<?php 

class Bar extends Foo { // in my plugin to extend the original plugin 
    public function __construct($myFooObject) { 
    foreach (get_object_vars($myFooObject) as $key=>$value){ 
     $this->$key = $value; 
    } 

    // <I want: $this = $myFooObject; but it doesnt work> 
    // <do some stuff special to Bar> 
    } 
} 

這不僅會爲Foo性實例,但在創建複製$myFooObject屬性。

+0

謝謝,就是這樣。 – Amber 2014-11-07 04:22:53

1

嘛。您已經繼承了Foo類的功能和成員。你在這裏錯過的是調用父類的構造函數(Foo的構造函數)。

以下行添加到您的酒吧的__construct()

parent::__constrcut(); 

酒吧現在看起來是這樣的:

class Bar extends Foo {  // in my plugin to extend the original plugin 
    public function __construct($myFooObject) { 
     parent::__construct(); // we've added this line to call the parent constructor 
     <do some stuff special to Bar> 
    } 
} 

在調用子類的構造父類的構造使你的對象的完整性,並允許該子類可以動態訪問其父項。

+0

我同意這是最好的選擇。但是,當基類對象在庫中構造時,這不是一個解決方案。 – 2014-11-24 11:05:40

相關問題