4

我有一个关于使用 PDO 的问题,但我无法找到答案。这对于 mysql/mysqli 连接也可能同样适用。

在我的项目的主要包含中,我使用创建了一个 PDO 对象

$pdo = new PDO('connection here');

好吧,我有一个需要访问数据库的类。因此,不要使用“global $pdo;” 在每个函数内部,我做了以下事情。

class MyClass(){
    private $db = null;
    __construct(){
        global $pdo;
        $this->db = $pdo;
    }
    function example(){
        $sql = 'A Query';
        $this->db->prepare($sql);
    }
 }

无论如何,我的问题是,这样做是否会创建 2 个与数据库的连接,因为我通过将类的 $db var 设置为等于它来有效地复制 $pdo?我问的主要原因是因为我看到这种情况在我们的系统中发生了很多,并且担心创建太多与 MySQL 的连接并由于不必要的连接而使系统崩溃。

作为第二部分,以下是否会导致重复,我可以通过参考吗?我有点害怕尝试它并导致某些东西破裂。

改变

function MyFunction($member_id, $pdo){
    //do something.
}

function MyFunction($member_id, &$pdo){
   //do something
}

谢谢!

4

2 回答 2

3

正如 deceze 在评论中提到的那样,您实际上并没有在此代码中复制 PDO 对象,您只是分配了一个额外的变量来引用同一个对象。

这个答案详细解释了,但总而言之,对象具有额外的间接级别 - 即使您不通过引用传递,您仍然只是复制指向对象的指针,而不是对象本身。

仅当您确实要修改变量并将修改传播回来时,才需要通过引用传递;在函数内部分配一个全新的对象$pdo将被视为修改变量,但操作对象不会。

与直觉相反,通过引用分配通常对性能不利,因为它破坏了 PHP 引擎中的“写入时复制”优化,该优化允许具有相同值的不同变量共享相同的内存。

于 2013-06-03T12:43:34.923 回答
0

它不会创建两个连接。要确认您可以使用:xdebug_debug_zval。请查看 php 手册以了解使用情况。您可以使用以下代码的帮助检查结果:xdebug_debug_zval('pdo'); 和 xdebug_debug_zval('db');

于 2013-06-03T13:00:23.933 回答