2011-10-21 58 views
0

父類有這樣一個構造函數:我應該爲擴展類編寫構造函數嗎?

function CD_Log($id = false) { 
    $this->__construct($id); 
} 

function __construct($id = false) { 
    global $cd; 

    if (!empty($id)) { 
     $this->id = $id; 
     $this->populate(); 
    } 
} 

在擴展級,我想有些父母var和孩子的VAR保存到不同的地方,也不會使用填充()函數。除此之外,孩子的構建方式與父母相同。我應該爲孩子寫一個構造函數嗎?

回答

1

如果您現在正在跟隨OOP,則應刪除$ cd的全局調用,將其設置爲父母或子女的成員變種。

正如我所看到的那樣,構造函數通常在您實例化對象時調用,而不是通過同一類的另一種方法(如CD_Log所執行的方法)來調用。

例如:

$myCdObject = new MyCdClass(); // Automatically calls constructor 
$myCdObject->Cd_Log($string); 

利用上述例子你是確保CD_Log方法僅處理log邏輯。除非你讓CD_Log靜態函數,那麼你可以實例中的類:

public static function CD_Log($id) 
{ 
    $myCdObject = MyCdClass(); // Automatically calls constructor 

    // Continue with `log` logic 
} 

要回答你的問題,你可能想在子類構造函數,它會調用父類的構造明確:

class parent 
{ 
    public function __construct($id) 
    { 
     $this->id = $id; 
    } 
} 

class child extends parent 
{ 
    public function __construct($id) 
    { 
     // Going to take advantage of shared logic 
     parent::__construct($id); 

     // Now lets do some child class specific stuff 
    } 
} 
+0

謝謝!順便說一句,如果孩子不需要父母的功能,我應該使用extrends方法嗎?當父母做事情時,只需要父母的孩子去做其他工作? – Jenny

+0

如果這些類將共享任何屬性,無論它是成員變量還是方法,最好進行擴展。 –

+0

謝謝!這很清楚! – Jenny

1

如果您需要 - 您可以重寫子類中的構造函數。但請記住,在這種情況下,父構造函數將不會自動調用,並且您需要手動執行此操作parent::_construct()

+0

@zerkmas,謝謝!所以,我會爲孩子寫一個構造函數。孩子的目的是在父母被調用時使用父母的var來執行其他工作。它會有自己的ID,所以,我應該給孩子的ID另一個名字,對吧? – Jenny

+0

@珍妮:由於缺乏你在那裏做什麼的信息,我無法回答你的問題。 – zerkms

相關問題