2011-08-19 105 views
0

我有一个在多个地方使用的PHP函数(称为funcA),所以我将funcA(和一些相关的函数)放在一个单独的文件中,该文件在其他PHP中为require d文件。 funcA对已经打开并由调用它的代码使用的数据库进行了大量查询。这些查询是通过MDB2对象完成的。从函数内部进行SQL调用

现在,在调用funcA的地方,调用例程将一个已经连接的MDB2对象指针传递给它。这工作正常。

我想知道的是,如果最好通过不传递MDB2object指针来创建funcA完全自包含,而是使用funcA require MDB2并使用其自己的mdb2对象连接到数据库。这是更多的内存,更多的CPU周期和更多的网络流量,但这是一个更好的做法吗?

回答

1

“最佳实践”是其中的一件事情这几乎不可能定义。然而,在我看来,函数依赖于其他的东西,最好将这个依赖关系传递给函数 - 就像你现在正在做的那样。

这允许您的函数执行所有操作,而无需担心查找并连接到数据库。它还允许你用虚拟数据库测试你的功能。

它通常被称为依赖注入,并在面向对象的体系结构中被广泛推荐。

+0

依赖注入也是一个很好的解决方案,但从OP的问题我假设他没有遵循任何OOP做法? – ChrisR

+0

@ChrisR:你说得对。在这种情况下没有OOP,但依赖注入的概念(通过像parms这样简单的事情)甚至适用于OOP之外。 –

+0

@JonathanM:绝对真实,你也应该努力做到这一点。唯一的问题是,在非OOP上下文依赖注入中的imo更难以追踪注册表或单身人士:)但是我很高兴你在正确的道路上,因为对我来说他们中的任何一个都是:) – ChrisR

1

有人也可能称之为不好的做法,但在这种情况下的解决方案可能是Registry patternSingleton PDO class

我不想开始讨论单身人士或注册管理机构的正确和错误,但在这种情况下,它可能是最简洁的解决方案,不涉及重构大部分应用程序。


一些非常基本的例子(你应该阅读了关于上面的链接,因为了解这些模式可以为您节省大量的时间和精力)

// Singleton class MyPDO 
// This assumes you have a singleton class extending PDO somewhere included or required 
function funcA(){ 
    $database = MyPDO::getInstance(); 
    // ... 
} 

// Registry pattern 
// This assumes that somewhere during your bootstrapping you create an 
// instance of PDO and store it in the registry so you can retrieve it 
// anywhere else later 
function funcA(){ 
    $database = Registry::get('Database'); 
    // ... 
} 
+0

谢谢,ChrisR。我真的想远离外部依赖(除了作为参数传递给函数外)。但是这对我以前不了解的注册管理机构有一定的启示,所以有+1。 :) –