从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');
    ...
}

09-25 18:29