我有一个单一的数据库连接,我得到:
$dbConnect = myDatabase::getInstance();
这很容易.我的问题是在函数和类中使用此连接的最少修辞和合法方式是什么?将变量声明为global,将其传递给每个函数,和/或在每个函数中重新创建此变量似乎很愚蠢.还有另一个答案吗?
显然我是一个菜鸟,我可以用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,则通常需要模拟数据库连接,这样每次运行测试套件时都不会操作数据库.
您仍然可以通过检查运行环境并使用模拟数据库抽象类配置注册表来解决这个问题,但它并不像依赖注入(DI)那样优雅.
我见过的DI和容器(对于PHP开发人员)的最佳解释是Fabien Potencier’s Dependency Injection with PHP 5.3(从幻灯片9开始).
你传递一个DI容器来代替一个注册表,它提供了一种优雅而简单的方法来获取依赖项的句柄(比如注册表),但它是灵活的,并且更加松散耦合,因此你可以在需要时模拟这些依赖项.