2008-12-03 46 views
3

我有一個類Page,它創建了DB的一個實例,名爲$db你能得到一個調用類的變量嗎?

Page__construct()中,我創建了新的$db對象,並從一個文件中提取了一堆配置數據。

現在DB類有一個方法_connectToDB()哪(嘗試)連接到數據庫。

在DB類中調用父類的配置數組有沒有辦法?如果我不需要,我不想製作全局變量,而且我也不想兩次獲取配置數據。

僞代碼可能是這個樣子......

$dbUsername = get_calling_class_vars(configArray['dbUserName']); 

回答

6

我發現初始化所有「重要」對象接近他們需要知道的變量通常更容易。你可以試試這樣說:

/* Code to get config variables here */ 
$DB = new DB($config); 
/* You might want to delete the database password from $config here */ 
$Page = new Page($config, $DB); 

這樣做,這樣意味着你也可以做類型檢查的數據庫對象,如果你想:

class Page { 
    function __construct(array $config, DBClass $db) { } 
} 
+0

這幾乎就是我沒有任何代碼的建議:) – grepsedawk 2008-12-03 02:12:47

2

爲什麼不配置參數傳遞給connectToDb功能或配置數據傳遞給DB類的構造函數。

而對於目錄回答問題:在當前上下文中,您不知道有關外部調用上下文的任何信息。

+0

我可以這樣做,我只是想可能有一個更簡單的方法.... – alex 2008-12-03 01:48:06

1

請參閱debug_backtrace()以獲取有關調用類或對象的信息。

然後參見Reflection以獲取有關給定類或對象的屬性的更多信息。

編輯:但是,對於它的價值,我也建議通過你需要的具體參數。引用調用者的數據可能構成Content Coupling

+0

我決定去解決上述我標記爲接受。我非常感謝你的所有幫助Bill :) – alex 2008-12-03 02:31:17

0

您可以傳遞孩子對父母的引用。例如:

class Parent { 
    function __construct() { 
    $this->myChild = new Child($this); 
    } 
    public function doSomething() {} 
} 

class Child { 
    function __construct(Parent $parent) { 
    $parent->doSomething() 
    } 
} 

您可能會覺得這很奇怪,因爲你仍然在父類的構造,因此你的父對象沒有完全構造呢。但是,即使在構造函數中,仍然可以使用$ this作爲對自己的引用。你只需要小心,你的孩子不會引用父母中還沒有被初始化的東西。

0

一般沒有簡單的方法來做這個。但作爲一般設計問題,我可以看到爲什麼要避免全局變量,但在應用程序範圍的配置情況下,對屬性進行全局訪問是完全合理的。

您可以使您的配置數據全局或只需將所需的屬性傳遞給數據庫對象初始化。

1

您可以使用static,如果你要共享變量,而無需經過這些:

class page{ 
    static $configArray = []; 
    function doWhatever(){ 
     $db = new DB(); 
     $db->connectToDB(); 
    } 
} 
class DB{ 
    function connectToDB(){ 
     $dbUsername = page::$configArray['dbUserName']; 
    } 
} 

在這種情況下很有意義的那些數據static,因爲即使你在頁面類的多個實例,配置參數應該始終相同。

無論如何,我認爲可以更好地構建並保留$ configArray只在數據庫類。如果你想從外面打電話,你可以使用相同的邏輯。

相關問題