2009-09-13 50 views
1
  • 我可以避免在Names對象內實例化一個Db對象來訪問嗎?
  • __autoload會爲此工作嗎?
  • 有沒有另一種智能解決方案?

我有以下類(它們是概念上的,所以如果執行他們將無法正常工作):自動加載數據庫類

Db { 
    function connect($config) { 
     // connect to data base 
    } 
    function query($query) { 
     // Process a query 
    } 
} 
Names { 
    function show_names($query) { 
     $Db = new Db(); // Is it possible to autoload this object? 
     $Db->query(query); 
     // Print data 
    } 
} 

回答

2

類可以自動加載,但對象必須實例化。看來你的問題是試圖讓這兩個類更加鬆散耦合。可能最簡單的解決方案是使用Singleton設計模式。但是,這不是最好的解決方案,因爲您可能決定擁有超過1個數據庫連接,並且在單元測試中也會出現問題。我建議看看Dependency Injection的概念,這個概念更復雜,但更靈活。

+0

真的是我走的路。打開另一個線程,顯示我所做的代碼:http://stackoverflow.com/questions/1418605/dependency-injection-in-php – Cudos 2009-09-14 07:38:31

2

,往往是用於數據庫連接相關的類A溶液與Singleton Design Patternexample of implementation in PHP工作)。

它允許有一個類將封裝到數據庫的連接,並將確保只有一個連接打開的PHP腳本的生命週期 - 從來沒有更多。

這將允許你使用一些語法如下:

$db = Db::getInstance(); 
$db->query('...'); 

或者:

Db::getInstance()->query('...'); 


關於自動加載:它會工作,只要:有它的方式將類的名稱映射到文件。