2011-03-21 75 views
0

首先,我對OOP很陌生,我正在苦苦掙扎。我有一個關於我的應用程序和繼承的當前設計的問題。從其他課程中檢索數據,同時延長

我有開始我所有的核心類引導程序文件,包括他們,這樣以後:

$security = new Security; 
$error_handler = new ErrorHandler; 
$application = new Application; 
$mysql = new MySQL; 
$template = new Template; 
$user = new User; 

我第一次加載安全和的ErrorHandler類,因爲應用程序類首先需要他們(扔自定義404錯誤,使GET變量安全等)。現在所有的類都擴展了Application類,但我似乎無法調用任何來自子類或父類的任何類的數據。

我讀到我需要首先調用父類的構造函數才能使用任何數據。這不是真正性感和有用的我的眼睛,我真的看不到使用然後延伸

我應該改變設計嗎?或者我怎麼能使用從一個到另一個班的數據?我已經嘗試了作文,但最終成了一場噩夢,因爲我根本無法使用任何不同的兒童班的數據。

回答

0

無論如何,這是一個奇怪的設置。您絕對不應該使用一些引導程序功能來預加載您的類,特別是如果某些類對其他類有有限的依賴關係。最好是這樣的:

您的Security和ErrorHandler類應該使用靜態方法來允許在不聲明類的情況下使用它們的功能,或者應該將它們創建爲Application類的類var。

class Security { 
    // can be invoked anywhere using Security::somefunction('blah'); 
    public static somefunction($somevar) { ... } 
} 

OR

require_once('security.php'); 
require_once('errorhandler.php'); 

class Application { 
    public $security; 
    public $errorHandler; 
    public function __construct() { 
     $this->security = new Security; 
     $this->errorHandler = new ErrorHandler; 
    } 
} 

我不知道,當你說你不能從任何類訪問數據,你的意思。類應該自然地繼承父母聲明的任何變量和函數。因此,例如:

require_once('application.php'); 
class User extends Application { 
    public function throwError($message) { 
     return $this->errorHandler->somefunction($message); 
    } 
} 

,而無需用戶類中明確宣稱$this->errorHandler,這仍然應該工作,爲$errorHandler類VAR在應用程序類中聲明。

0

如果您有一個子類,它定義了一個__construct()方法,並且希望調用它父級的方法__construct(),那麼子類的__construct()方法必須調用父類的方法。

這就是它在PHP;這就是你必須做的;沒有太多的選擇。


作爲參考,引用本手冊的Constructors and Destructors部分:

父構造函數不叫 暗示如果子類定義 構造。爲了運行一個 父構造函數,需要在 子構造函數中調用 parent::__construct()

相關問題