2009-12-21 53 views
3

我有一個父類:是有一個__construct()等效延長類

Abstract Class Base { 
    function __construct($registry) { 
     // stuff 
    } 
} 

我然後具有延伸該類至少2類

class Cms extends Base { 
    // a few functions here 
} 

和這一個

class Index extends Base { 
    // a few functions here 
} 

對於CMS類,用戶需要登錄。會話已經啓動,我想檢查用戶是否通過使用會話變種進入。所以我想要做的是:

class Cms extends Base { 
    function __construct() 
    { 
     // check the user session is valid 
    } 
    // a few functions here 
} 

但當然,這將覆蓋父構造類和它設置的一切。有沒有辦法可以在子類中定義__construct()類型的方法?

回答

8

從孩子的構造函數,你可以調用父類的一個:

class Cms extends Base { 
    function __construct() 
    { 
     parent::__construct(); 
     // check the user session is valid 
    } 
    // a few functions here 
} 

Constructors and Destructors頁的手冊上的例子,說明(引用)

注意:如果子類 定義了構造函數,則父構造函數不是 隱式調用。
爲了運行父構造函數,需要調用 parent::__construct()子項構造函數 。

6

一個類的構造函數的調用不會在php中自動啓動。您必須手動添加對父級構造函數的調用。 (我認爲這是一個缺陷)

class Cms extends Base { 
    function __construct() 
    { 
     parent::__construct(); 
     // check the user session is valid 
    } 
    // a few functions here 
} 

PHP: Scope Resolution Operator (::)說:

當一個子類覆蓋的方法的父母的定義,PHP將不會調用父類的方法。是否調用父進程的方法取決於擴展類。這也適用於構造函數和析構函數,超載和魔術方法定義。
0

與類擴展,也就是說,如果你重載__set(),您可以使用相同的代碼(父:: __方法),以確保你得到所有的行爲也打交道時,該解決方案還適用於所有的PHP魔術方法在父類中指定。

VolkerK:爲什麼這是一個缺陷?這個假設似乎是,如果你重寫了一個方法的基類行爲,那麼你想要替換那個行爲,除非你特別聲明。如果我可以擴展一個方法,我會感到非常痛苦,但總是在父類中調用默認行爲,以及我正在做的任何事情。其他OO語言是否以這種方式實現?