3

你好,我有一个代码,他们用它来连接数据库

$db= DAL::get_instance();           

$count=$db->read_single_column("select count(id) from ".TABLE_PREFIX."users where email=? and status=1", array($email));
 echo "Aqui".$count;

我为该站点创建了一个空白的新页面,但我认为$db= DAL::get_instance();它不起作用..我不想创建到数据库的多个连接,所以我如何在 PHP 上使用 DAL,这样我就可以使用同一个链来连接......

DAL 在哪里以及如何设置?(我如何搜索设置的字符串,格式是什么)

谢谢

我在库核心上找到了一个 DAL.php .. 但它是用 Ioncube 编写的.. 所以我的猜测是我无法看到它是如何设置的 :(

4

1 回答 1

2

你的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,这对性能有很大影响
  • 这是一个黑客。您还会丢失第一个数据库连接,因此您需要额外的内务处理。
于 2013-05-26T14:48:58.797 回答