通过引用传递PDO连接对象?

时间:2013-09-29 07:13:10

标签: php mysql variables pdo pass-by-reference

我最近开始重构我用于项目的一些“复制粘贴”数据库类。我正在修改登录类并遇到了一个有趣的功能。

我的Login类有一个如下所示的函数:

function &db_connect() {
    require_once('mysql.php');
    $db = new DB();
    return $db;
}

有趣的是它返回对$db对象的引用而不是实际对象。多数民众赞成,但后来我发现了这个:

function __construct(&$db) {
    $this->db = $db;
    $this->date = $GLOBALS['date'];
    if ($_SESSION['logged']) {
        $this->_checkSession();
    }
}

该代码的使用方式如下:

$db = db_connect();
$user = new User($db);

正如您所看到的,实际上发生的是我传递了对DB实例的引用而不是实际对象。我在3年前写这段代码时显然有我的理由,所以现在我想知道为什么?

我的所有“DB”类和对象都应该通过引用传递吗?简单地通过值传递PDO对象会导致它创建新的连接吗?什么是正确的做法,我应该使用什么?

2 个答案:

答案 0 :(得分:2)

存储在变量中的值是对象引用。通过值传递此引用通常是人们如何做到这一点 - &是不必要的,并且在此处没有任何好处。

如果你从构造函数中分配给$db,这将改变你传入的变量的值:

$a = 1;

function foo(&$p) {
    $p = 2;
}

foo($a);
// $a is now 2

我认为在这种情况下使用&是错误的,因为如果您将代码更改为$db,则可能会导致意外行为。突然,来电者也会看到他们的变量。

答案 1 :(得分:0)

以下程序说明了如何在PHP 5中处理作为参数的对象:

<?php

class Foo {
  public $value;
  public function __construct($value) { $this->value = $value; }
}

function swap      ($a, $b)   { $tmp = $a; $a = $b; $b = $tmp; }
function swap_refs (&$a, &$b) { $tmp = $a; $a = $b; $b = $tmp; }
function inc       ($a, $b)   { ++$a->value; ++$b->value; }

$a = new Foo(1); $b = new Foo(2);

swap ($a, $b);
printf("swap():      \$a %d, \$b %d\n", $a->value, $b->value);

swap_refs ($a, $b);
printf("swap_refs(): \$a %d, \$b %d\n", $a->value, $b->value);

inc($a, $b);
printf("inc:         \$a %d, \$b %d\n", $a->value, $b->value);

打印出来

swap():      $a 1, $b 2
swap_refs(): $a 2, $b 1
inc:         $a 3, $b 2