数组中的对象是通过引用传递的吗?

时间:2011-07-07 09:42:59

标签: php arrays object reference

在下面的情况下,

class my_class {

    public __construct($params = array()){

        **** do something
    } 

 }

 $other_object = new some_class();

 $object = new my_class(array(
                         'var1' => 'test' 
                         'object' => $other_object));

$ other_object 将通过引用或值传递?

5 个答案:

答案 0 :(得分:16)

对象始终是引用,除了clone它明确。

您可以使用spl_object_hash()检索“对象ID”,然后将它们相互比较。请记住,一旦垃圾收集器从内存中删除了一个对象,ID就可能被重用了。

答案 1 :(得分:2)

以下是一个示例,显示引用对象的每个位置...... http://codepad.org/HK6Oo4xL

答案 2 :(得分:0)

php中的对象按值传递。有关详细信息,请参阅this answer

答案 3 :(得分:0)

PHP 5中的对象始终通过引用传递。在debug_zval_dump()的帮助下,您可以检查变量的引用计数以计算对象实例的引用数。注意文档中的注释,你会发现许多有关将变量传递给函数的有趣信息。

答案 4 :(得分:0)

从PHP 5开始,PHP对象变量包含实际变量的引用或标识符。这是一个证明这一点的例子。

class test{
public $test = 1;
}

$obj1 = new test;
$orginal = [$obj1,array(2),3];
$copy = $orginal;
echo 'orginal array';
var_dump($orginal);
echo 'copy of orginal';
var_dump($copy);

//after changing
$copy[0]->test = 'changed';
$copy[1][0] = 'changed';
$copy[3] = 'changed';
echo 'orginal array after changing its copy';
var_dump($original);
echo 'copy of orginal after changing';
var_dump($copy);

输出为

original array
array (size=3)
  0 => 
    object(test)[38]
      public 'test' => int 1
  1 => 
    array (size=1)
      0 => int 2
  2 => int 3

copy of original
array (size=3)
  0 => 
    object(test)[38]
      public 'test' => int 1
  1 => 
    array (size=1)
      0 => int 2
  2 => int 3

original array after changing its copy
array (size=3)
  0 => 
    object(test)[38]
      public 'test' => string 'changed' (length=7)
  1 => 
    array (size=1)
      0 => int 2
  2 => int 3

copy of original after changing
array (size=3)
  0 => 
    object(test)[38]
      public 'test' => string 'changed' (length=7)
  1 => 
    array (size=1)
      0 => string 'changed' (length=7)
  2 => string 'changed' (length=7)

当副本中的对象发生更改时,原始对象也会更改,但数组和变量保持不变,因为它们是作为值传递的。

有关对象参考的更多信息,请参阅:Objects and reference