通过引用或值传递对象

时间:2011-07-02 17:36:33

标签: php object pass-by-reference pass-by-value

我确信这个问题已被问了一千次,但我找不到一个我能理解或在任何地方使用的答案。

在我的项目中,我需要在很多类中使用我的sql类和其他misc类。然后我很想知道传递物体的最佳表现方式是什么。

我应该将对象传递给类构造作为参考吗?

class MyClass {
    private $_link;

    function __construct(&$db) {
        $this->_link =& $db;
    }
}

或价值..

class MyClass {
    private $_link;

    function __construct($db) {
        $this->_link = $db;
    }
}

或只是创建一个新对象?

class MyClass {
    private $_link;

    function __construct() {
        $this->_link = new DB();
    }
}

2 个答案:

答案 0 :(得分:2)

如果您使用的是PHP5 +,几乎在所有情况下,默认情况下都会通过引用传递对象。

答案 1 :(得分:0)

由于对象已经在PHP5 +中“通过引用”传递,然后使用&实际上将传递“对对象引用的引用”,而不仅仅是简单的“对对象引用”。这很关键,因为它将允许该函数在其本地范围内全局更改实际引用,并有可能完全删除该对象。例如,可能会认为以下通过ref传递对象和“正常”传递对象的示例完全相同:

$aa = new stdclass;
$aa->aa = 1;
byRef($aa);
function byRef(&$aaa) {
    $aaa->aa = 2;
}
var_dump($aa); // Outputs {aa:2}

$bb = new stdclass;
$bb->bb = 1;
byVal($bb);
function byVal($bba) {
    $bba->bb = 2;
}
var_dump($bb); // Outputs {bb:2}

从输出来看,它看起来相同。但这是一个好习惯吗?取决于您想做什么。看同一示例,其中我们销毁了原始引用并“删除”了该对象:

$aa = new stdclass;
$aa->aa = 1;
byRef($aa);
function byRef(&$aaa) {
    $aaa->aa = 2;
    $aaa = 0; // We are changing $aa, not $aaa, because $aaa is just a reference
}
var_dump($aa); // Outputs int:0, $aa is not an object anymore

$bb = new stdclass;
$bb->bb = 1;
byVal($bb);
function byVal($bba) {
    $bba->bb = 2;
    $bba = 0;
}
var_dump($bb); // Outputs {bb:0}

代码说明一切。在某些情况下,这是必需的,而在其他情况下,这是至关重要的。在我看来,除非您真的知道自己在做什么,否则请不要通过引用。