我对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。
答案 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);