2011-04-26 105 views
0

我理解OOP中继承的基本原则,但我有一个特定的事情,我正在尝试去做,并希望获得有关如何做到最好的建议。了解PHP继承

可以说我有一个核心类:

class Core { 
    .... 
} 

和我也有2个或更多的是扩展此功能

class MyClass1 extends Core { 
    .... 
} 
class MyClass2 extends Core { 
    .... 
} 

,我也具有其中我执行数据库类其它类我的查询,我想传递一个数据库类的实例化对象(可能通过引用)到我的每一个类。其中一个原因是存储执行页面的查询列表或计数。

我应该怎么做?

+0

你的问题有点含糊不清。你想要一个主实例(单例模式)还是一种追踪新实例(工厂模式)的方法? – Christian 2011-04-26 22:00:46

+0

现在,PHP通过引用传递所有类的实例。 – SteAp 2011-04-26 22:03:13

回答

3

则可以将您的数据库对象的实例传递给一个构造你的类:

class Core 
    protected $db; 

    public function __construct(Your_Db_Class $database) { 
     $this->db = $database; 
    } 

} 

,然后,从你的方法,用$this->db工作,访问数据库。


当然,instanciating你的类时,你必须指定数据库对象:

// somewhere, instanciate your DB class 
$db = new Your_Db_Class(); 

// And, then, when instanciating your objects : 
$obj = new MyClass1($db); 


另一种方法是使用Singleton design pattern,所以有可能是只有一个实例你的数据库类。

可能更容易设置;但之后不太容易进行单元测试。

+0

我想到了这种方式,但是想知道是否可以实例化MyClass2而不必将数据库类传递给它,并且它仅仅知道它是因为核心类 – Lizard 2011-04-26 22:07:16

+0

不,没有*魔法*:即使代码是在父类中,您仍然必须指示对象*(它使用来自父类和子类的代码)*,它必须在哪个数据库对象上工作。 – 2011-04-27 03:12:41

+1

[单身人士在PHP中没有用处。](http://gooh.posterous.com/singletons-in-php) – Gordon 2011-04-28 06:56:13

0

您可以将数据库对象作为参数传递给类的__construct函数,然后在该函数中将db对象分配给该类的成员,例如$ this-> database_handler。

另一种可能性是使用全局变量作为数据库对象,但全局变量由于多种原因而是恶意的,所以我们忽略它。

另一个说明:默认情况下,所有对象都是通过引用传递的,所以你不必担心这个。