当您在 php 中通过引用传递对象时会发生什么?
What happens when you pass an object by reference, in php, under the hood?
有知道的人的问题。 PHP documentation (for php5) 清楚地声明你不通过引用在 php 中传递对象,因为对于接受对象的方法,值实际上是passed 是 "object identifier which allows object accessors to find the actual object"。问题是,当您实际 这样做时会发生什么?
考虑以下代码:
<?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
问题是为什么?谁能描述这个仍然允许访问实际对象的对象标识符引用发生了什么?
任何保存对象的变量都不是直接保存对象。它包含对象的标识符。把它想象成一个对象,它存在于对象池中的某个地方,并附有一个数字,例如#5。所有变量包含的是"object #5"。 PHP 知道该变量引用一个对象,它应该是对象 #5。
每当您使用此类包含对象引用的变量时,PHP 从对象池中查找引用的对象。
当您将这样的变量传递给函数时,PHP 复制该引用。 然后有两个变量保存内容 "object #5"。不是对象本身已被复制,只是这个小便条上面写着 "object #5".
当您通过引用将这样的变量传递给函数时,嗯,您传递的是注释"object #5"引用。 PHP 不会复制它。但它仍然只是一个变量 "object #5",因此当您尝试使用它时,PHP 将从池中查找对象。
此对象引用机制与&
pass-by-reference机制不同。对象引用机制与所有其他 pass-by-value 操作完全相同;只是表示对对象的引用的值总是以特定方式处理(PHP 必须在别处查找实际对象)。
有知道的人的问题。 PHP documentation (for php5) 清楚地声明你不通过引用在 php 中传递对象,因为对于接受对象的方法,值实际上是passed 是 "object identifier which allows object accessors to find the actual object"。问题是,当您实际 这样做时会发生什么?
考虑以下代码:
<?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
问题是为什么?谁能描述这个仍然允许访问实际对象的对象标识符引用发生了什么?
任何保存对象的变量都不是直接保存对象。它包含对象的标识符。把它想象成一个对象,它存在于对象池中的某个地方,并附有一个数字,例如#5。所有变量包含的是"object #5"。 PHP 知道该变量引用一个对象,它应该是对象 #5。
每当您使用此类包含对象引用的变量时,PHP 从对象池中查找引用的对象。
当您将这样的变量传递给函数时,PHP 复制该引用。 然后有两个变量保存内容 "object #5"。不是对象本身已被复制,只是这个小便条上面写着 "object #5".
当您通过引用将这样的变量传递给函数时,嗯,您传递的是注释"object #5"引用。 PHP 不会复制它。但它仍然只是一个变量 "object #5",因此当您尝试使用它时,PHP 将从池中查找对象。
此对象引用机制与&
pass-by-reference机制不同。对象引用机制与所有其他 pass-by-value 操作完全相同;只是表示对对象的引用的值总是以特定方式处理(PHP 必须在别处查找实际对象)。