我有一个单例数据库连接:
$dbConnect = myDatabase::getInstance();
这很容易。我的问题是在函数和类中使用这种连接的最不修辞和合法的方式是什么?必须将变量声明为全局变量,将其传递给每个函数,和/或在每个函数中重新创建该变量,这似乎很愚蠢。还有其他答案吗?
显然我是一个新手,我可以用 10 种不同的方法解决这个问题,但没有一种对我有真正的吸引力。如果我可以在任何函数中访问 $dbConnect 变量而不需要将其声明为全局变量或将其传入,那将会容易得多。我知道我可以将变量添加到 $_SERVER 数组中......有什么问题吗做这个?这对我来说似乎有些不合适。
另一个简单的问题:这样做是不好的做法吗:
$result = myDatabase::getInstance()->query($query);
直接从一个函数中?
最佳答案
其中一些会归结为口味。在工作中,我们还通过
获取了一个 ADODB 连接句柄$db = Registry :: getDB();
同样,您可以使用方法链来简写部分代码:
$name = Registry :: getDB()->getOne(
"SELECT name FROM user WHERE user_id = ?", $userId
);
使用注册表意味着您的调用代码对您的 Registry
类具有具体的依赖性。这使得测试您的代码变得困难(就我个人而言,这是我唯一一次使用注册表撞墙)。
如果你想add unit tests对于您的代码,您通常希望模拟数据库连接,这样您就不会在每次运行测试套件时都操作数据库。
您仍然可以通过检查您的运行环境并使用模拟数据库抽象类配置注册表来解决这个问题,但它不像依赖注入(inject) (DI) 那样优雅。
我见过的关于 DI 和容器的最佳解释(对于 PHP 开发人员)是 Fabien Potencier's Dependency Injection with PHP 5.3 (从幻灯片 9 开始)。
您传递一个 DI 容器来代替注册表,它提供了一种优雅而简单的方法来获取依赖项(如注册表)的句柄,但它更灵活且耦合更松散,因此您可以在需要时模拟这些依赖项。
关于php - 在函数和多个脚本 (PHP) 中使用单例数据库类 - 最佳使用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2431023/