任何知道的人的问题。 PHP documentation(对于php5)清楚地表明你不能通过php中的引用传递对象,因为对于接受对象的方法,实际传递的值是一个"对象标识符,允许对象访问器查找实际对象"。问题是,当你做这样做时会发生什么?
请考虑以下代码:
<?php
function foo(&$arg){
if(is_array($arg)){
print $arg['foo'];
}
if(is_object($arg)){
print $arg->{'foo'};
}
}
$o1 = new \stdClass;
$o1->foo = 'bar';
$a1 = ['foo'=>'bar'];
print sprintf("O1 foo: %s", foo($o1));
print sprintf("a1 foo: %s", foo($a1));
这正确输出:
o1 foo: bar
a1 foo: bar
问题是为什么?任何人都可以描述这个仍然允许访问实际对象的对象标识符引用发生了什么吗?
答案 0 :(得分:3)
任何包含对象的变量都不会直接保存对象。它包含对象的标识符。想象一下,它生活在物体池中的某个物体上,物体上附有一个数字,例如#5。所有变量包含“object#5”。 PHP知道变量引用一个对象,它应该是对象#5。
每当你使用这样一个持有对象引用的变量时,PHP都会从对象池中查找引用的对象。
当您将这样的变量传递给函数时,PHP 会复制该引用。然后有两个变量保存内容“object#5”。不是对象本身已被复制,只是这个小小的音符说“对象#5”。
当你将这样的变量传递给函数引用时,你正在通过引用传递那个音符“object#5”。 PHP不会复制它。但它仍然只是一个变量,说“object#5”,所以当你尝试使用它时,PHP会从池中查找对象。
此对象引用机制与&
pass-by-reference机制不同。对象引用机制与所有其他pass-by-value操作完全相同;它只是表示对象的引用的值总是以特定的方式处理(PHP必须在其他地方查找实际的对象)。