通过引用对象方法传递参数时,我发现了一种奇怪的行为:
class Test
{
private $value;
public function Set($value)
{
$this->value = $value;
}
public function Get(&$ref)
{
$ref = &$this->value; //SET REF PARAMETER TO THIS VALUE BY REF
}
}
$test = new Test();
$test->Set('test');
$test->Get($value1);
var_dump($value1); //NULL INSTEAD OF 'test'!
编辑:本例的 GetByRef(...) 名称错误,重命名为:Get(...)
edit2:我忘记了我卡住的真实测试用例:
$test->Get($value1);
$test->Get($value2);
$value1 = 'Another test value';
echo $value2; //SHOULD BE SAME: 'Another test value';
$value 2 不知道是否创建了 value1,因此标准 $value 2 = &$value 1 在这里不起作用。
您正在通过引用分配给引用。这就是为什么你会得到null
.如果您正常分配,它工作正常:
public function GetByRef(&$ref) {
$ref = $this->value;
}
通过在方法签名中声明&$ref
并调用该方法,将在调用作用域中创建一个默认值为 null
的变量,该变量在方法内部引用为 $ref
。通过执行$ref = &$this->value
,您基本上删除了该引用并创建了一个新的引用$ref
。使用 =&
始终创建一个新的引用变量;如果要更改其值,则必须使用 =
为其赋值。因此,在调用作用域中创建的变量仍设置为其初始值null
,并且它对方法内部$ref
的引用被破坏。