你的DAL
类是用户定义的——PHP 中没有这样的东西。将它的整个代码发布在某个地方,有人可能会告诉你如何处理它。
但是,我将根据您所说的提供泛型。static::get_instance()
并且提到您不能触发多个实例,这表明您的数据库抽象层实际上是一个Singleton。这很好,但又一次,这很糟糕。Singleton 的全部目的是将类限制为一个实例,这对于数据库层来说非常好。
但是,在您的情况下,您似乎想同时连接到多个数据库。根据代码的编码方式,您可以在几乎不修改代码的情况下执行此操作。
作为参考,这是 DAL 的简化版本:http: //codepad.viper-7.com/gPQ8bo。我保留了您关心的部分,并删除了其他所有内容。
显而易见的方式
撕掉单例并开始使用依赖注入。
不太明显的方法
您可以使用Reflection
重置单例的私有静态成员。这是一个 hack,所以只有在必要时才使用。
解决这个问题的关键在于:http: //codepad.viper-7.com/ja6zHL。代码如下:
$reflection = new \ReflectionProperty('MySingleton', 'instance'); // Get a handle to the private self::$instance property
$reflection->setAccessible(true); // Set it to public
$reflection->setValue(null, null); // Modify it
// Optional: re-restrict it
$reflection->setAccessible(false);
请注意,这是出于三个原因:
- 你不应该这样做。相反,您应该考虑使用实际上允许您触发多个连接或自己创建一个的 DAL
- 这使用
Reflection
,这对性能有很大影响
- 这是一个黑客。您还会丢失第一个数据库连接,因此您需要额外的内务处理。