2009-09-13 49 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('...'); 


关于自动加载:它会工作,只要:有它的方式将类的名称映射到文件。