我最近开始重构我用于项目的一些“复制粘贴”数据库类。我正在修改登录类并遇到了一个有趣的功能。
我的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对象会导致它创建新的连接吗?什么是正确的做法,我应该使用什么?
答案 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