通过引用或值传递对象

Posted

技术标签:

【中文标题】通过引用或值传递对象【英文标题】: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();
    

【问题讨论】:

When to pass-by-reference in php 看这里的例子:php.net/manual/en/language.oop5.references.php 【参考方案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

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

【讨论】:

以上是关于通过引用或值传递对象的主要内容,如果未能解决你的问题,请参考以下文章

通过引用或值传递的数组[重复]

使用 JNI(更具体地说是 Android NDK)时,Java 是不是通过引用或值传递给 C

Javascript 是不是通过引用或值将数组传递给函数?

将 lambda 作为参数传递 - 通过引用或值?

按引用传递或按值传递指针容器之间的区别

按值传递比通过 const 引用传递更快的经验法则?