通过引用参数传递参数时,我发现了一个奇怪的行为:
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';
$ value2不知道是否创建了value1,因此标准的$ value2 =& $ value1在这里不起作用。
答案 0 :(得分:4)
您通过引用分配参考。这就是你得到null
的原因。如果正常分配,它可以正常工作:
public function GetByRef(&$ref) {
$ref = $this->value;
}
通过在方法签名中声明&$ref
并调用方法,在调用范围中创建一个变量,其默认值为null
,在方法内引用为$ref
。通过执行$ref = &$this->value
,您基本上删除了该引用并创建了新的引用$ref
。使用=&
始终会创建一个新的引用变量;如果您想要更改其值,则必须使用=
进行分配。因此,在调用范围中创建的变量仍设置为其初始值null
,并且该方法内对$ref
的引用将被破坏。