【问题标题】:Pass object by reference or value通过引用或值传递对象
【发布时间】:2011-09-27 08:44:29
【问题描述】:

我确信这个问题已经被问过一千次了,但我很难找到一个我可以理解或在任何地方使用的答案。

在我的项目中,我需要在很多类中使用我的 sql 类和其他杂项类。然后我很想知道传递对象的最佳性能方式是什么。

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

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();
    }
}

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • “默认情况下”听起来如果你使用&通过引用传递它会是一样的,但它是不同的
【解决方案2】:

由于对象已经在 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}

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

【讨论】:

    猜你喜欢
    • 2018-04-03
    • 2014-02-08
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    相关资源
    最近更新 更多