传入连接对象或在类中创建它? (OOP)

时间:2013-09-15 23:27:25

标签: php oop

我有一个处理许多数据库操作的类。我希望这个类尽可能地重复使用和精心设计,而且我对OOP还不熟悉,所以我很感激这个解决方案:

更好的做法是:

class MyDatabase extends Database 
{
    private $connection;

    public function __construct(mysqli $connection)
    {
        $this->connection=$connection;        
    }

    //More functions below

}

class MyDatabase extends Database 
{
    private $connection;

    public function __construct()
    {
        $this->connection=new mysqli(...);
    }

    //More functions below

}

两者的优点/缺点是什么,哪一个更经常使用?我无法自己决定应该开始使用哪一个,这将影响我正在编写的其他应用程序。

谢谢

2 个答案:

答案 0 :(得分:1)

我建议采用第二种方法,特别是如果你不熟悉OOP。

OO中的一个关键原则是"信息隐藏",您希望在类中隐藏尽可能多的信息,以免将复杂性暴露给外部。

第二种方法的优点是它完全隐藏了所有数据库操作细节,因为构造函数不带参数。

有时候,第一种方法在更大,更复杂的系统中更受欢迎,因为你的" MyDatabase" class需要能够处理不同类型的底层数据库连接,并且需要在其构造函数中接受不同类型的连接句柄。但这是一个不同的设计,我们在其中公开数据库句柄细节,并且基本上将其作为API的一部分(也就是OO术语中的合同)包含在外部世界中。

另一种常见的OO实践是频繁的重构。如果你有一个好的IDE并保持一个相当好的编程实践,你可以相当容易地将你的代码从简单的方法(#2)重构为更复杂的(#1)而不会有太多麻烦。所以我说继续#2,保持简单,并在/如果需要的话重构。

就性能而言,我认为这两种方法没什么区别,你可以(而且应该)总是使用持久连接。所以对象开销应该是最小的。

答案 1 :(得分:1)

我建议第一个,没有硬编码依赖,可测试,并且可以随时更改连接object。我强烈建议你watch this