从php文档来看,PDO连接在其对象的生存期内一直存在。所以在下面的代码中...
<?php
for($i = 0; $i < 5; $i++)
{
myfunc();
}
function myFunc()
{
$conn = new PDO("connectionStuff");
//Do things
}
?>
...由于$ conn仅在myFunc的范围内,每次myFunc完成执行时,PDO连接都会关闭吗?还是在整个页面完成之前将5个PDO连接悬空打开?
我必须在myFunc的末尾设置$ conn = null还是不必要?
最佳答案
只是为了回答您在评论中提出的问题。在现代编程中,最佳实践是对像您这样的情况使用dependency injection。此外,使用容器更为可行。在现代的面向对象的框架中,总是有一个服务管理器,它充当容器并提供您需要的所有东西。
class DiContainer {
protected $instances = [];
public function __construct(array $aInstances = []) {
$this->instances = $aInstances;
}
public function set($sName, $oInstance) {
if (isset($this->instances[$sName]) {
throw new \Exception(sprintf(
'An instance for "%s" already exists'
$sName
));
}
$this->instances[$sName] = $oInstance;
}
public function get($sName) {
if (!isset($this->instances[$sName)) {
throw new ErrorException(sprintf(
'No instance for "%s"',
$sName
));
}
return $this->instances[$sName];
}
}
这是依赖项容器。您可以在其中存储应用程序所需的所有实例。请记住,这是一个未经测试的小示例,它显示了依赖项注入的好处。您不应该以富有成效的方式使用它,因为DI容器比这个简单的示例要复杂得多。
实际上,您可以像下面的示例一样使用它。
// when you instanciate your application
$oContainer = new DiContainer([
'db-connection' => new PDO(...),
]);
// in your specific class
public function doSomethingWithDatabase(DiContainer $oContainer) {
$oDbHandle = $oContainer->get('db-connection');
...
}