php PDO连接关闭范围

时间:2017-03-08 18:31:51

标签: php mysql pdo

从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,还是不必要?

1 个答案:

答案 0 :(得分:1)

只是回答你在评论中提出的问题。在现代编程中,最好的做法是将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');
    ...
}