OOP PHP问题让2个类与同一个父类一起工作

时间:2011-03-25 04:42:28

标签: php oop

我对OOP PHP相当新,并且在让几个课程很好地协同工作方面遇到了麻烦。我正在使用数据库抽象类来完成与数据库交谈的所有繁琐工作,这一切都很好,我可以使用其他类来扩展它,并使用方法来进行特定操作。数据库类有一个include_once来读取数据库的配置设置。

我感到困惑的是,如果我需要使用第二类来访问同一页面上的数据库,我需要引用具有相同设置的第二个配置文件。

示例:我有一个我正在构建的网站的产品类,它工作正常。我想使用第二类来控制实际的购物车方面,但是当我尝试使用Cart类扩展数据库类时,页面会失败,除非我覆盖它需要引用的配置文件。

为什么每个类都需要单独的配置文件,有没有办法解决这个问题?看起来很愚蠢,我需要尽可能多的配置文件,因为有与数据库交互的类。

感谢您的帮助。 乔恩

*额外信息* 对不起伙计们,一切都在同一个数据库中。这是一些示例代码。

所有配置文件都是这样的:

$ DB_HOST =“localhost”;    $ DB_USER =“abcdef”;    $ DB_PASS =“123456”;    $ DB_DATABASE =“newdb_name”;

然后我覆盖它需要引入的配置文件,但在子类中执行此操作:

function __construct()
  {
    $this->conffile = "db_conf1.php";
    parent::__construct();
  }

并为每个新子类更改$ this-> conffile。

2 个答案:

答案 0 :(得分:1)

  

我正在使用数据库抽象类来完成与数据库交谈的所有繁琐工作,这一切都很好,我可以使用其他类来扩展它,并使用方法进行特定操作。数据库类有一个include_once来读取数据库的配置设置。

这是一个糟糕的设计。如果你需要在同一个脚本中一起使用其中两个类,那么你最终会结束w -

  

我感到困惑的是,如果我需要使用第二类来访问同一页面上的数据库

p,你已经得到了它。

您通常每页只需要一个数据库连接。这通常意味着只有一个数据库对象。你有两个很好的PHP选项来处理这个问题。

第一个有一个奇特的名字:“Dependency Injection。”在DI中,您的对象需要一些外部资源才能工作。他们在施工期间收到这笔资源。

换句话说,您在构造函数中传递数据库对象。

class Foo {
    protected $db;
    public function __construct($other, $args, $db) {
        $this->db = $db;
    }
}

通过这种方式,您仍然可以方便地从对象中引用数据库,而无需使其过于混合。

另一个选项有一个奇特的名字:“Registry Pattern”。注册管理机构充当“众所周知”的类和实例的网关。它们基本上是查找表,允许您使程序依赖于将存在于注册表中的数据,而不是硬编码类名或使用全局变量。

或者,换句话说,它只是一个带有特殊名称的全局哈希。

正确行事需要上课。 This blog post from 2009是一个有趣的起点,因为它完全解决了如何处理数据库适配器的问题。我将在这里省略示例代码,因为博客文章在解释自己方面做得不错。

当然,还有第三种选择,它是最糟糕的,但在PHP领域最常见:将数据库对象分配给全局,然后根据需要引用全局。它很快,很脏,通常可以工作......但是可以使维护变得困难,并且可以使自动化测试不可能正确完成。 不要这样做。

答案 1 :(得分:0)

您应该从数据库类中删除对配置文件的依赖性,并将您需要的变量传递给数据库构造函数,例如,

class Database {

    public function __construct($host, $user, $pass, $dbname, $port) {
        // create connection
    }

    //...
}

将两个数据库的信息放入一个配置文件中,并创建如下数据库对象:

include_once 'config.php';

$db1 = new Database($host1, $user1, $pass1, $dbname1, $port1);
$db2 = new Database($host2, $user2, $pass2, $dbname2, $port2);