PHP参数by ref=>;分配给ref=NULL

PHP参数by ref=>;分配给ref=NULL,php,reference,Php,Reference,通过引用对象方法传递参数时,我发现一个奇怪的行为: class Test { private $value; public function Set($value) { $this->value = $value; } public function Get(&$ref) { $ref = &$this->value; //SET REF PARAMETER TO THIS VALU

通过引用对象方法传递参数时,我发现一个奇怪的行为:

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在这里不起作用

您正在逐个引用分配给引用。这就是为什么会出现
null
。如果您正常分配以下内容,则工作正常:

public function GetByRef(&$ref) {
    $ref = $this->value;
}

通过在方法签名中声明
&$ref
并调用该方法,将在调用范围中创建一个默认值为
null
的变量,该变量在方法中被引用为
$ref
。通过执行
$ref=&$this->value
基本上删除了该引用,并创建了一个新引用
$ref
。使用
=&
始终创建一个新的参考变量;如果要更改其值,则必须使用
=
为其赋值。因此,在调用作用域中创建的变量仍设置为其初始值
null
,并且它对方法中
$ref
的引用被中断。

您正在通过引用来分配引用。这就是为什么会出现
null
。如果您正常分配以下内容,则工作正常:

public function GetByRef(&$ref) {
    $ref = $this->value;
}

通过在方法签名中声明
&$ref
并调用该方法,将在调用范围中创建一个默认值为
null
的变量,该变量在方法中被引用为
$ref
。通过执行
$ref=&$this->value
基本上删除了该引用,并创建了一个新引用
$ref
。使用
=&
始终创建一个新的参考变量;如果要更改其值,则必须使用
=
为其赋值。因此,在调用范围中创建的变量仍然设置为其初始值
null
,并且它对方法中
$ref
的引用被中断。

您在哪里定义get函数$测试->获取($value1);抱歉,名称错误-编辑为“真实测试用例”:没有理由让它按照您希望的方式运行。不要这样写代码。PHP引用不是C指针,不要像对待它们那样对待它们。显式地将一件事分配给另一件事,不要依赖间接修改。因此,当我在那里存储一个巨大的数组时,唯一的方法是为每个调用方创建一个副本?数据不会通过传递到函数或从函数返回来自动复制。PHP比这更智能!在哪里定义get函数$测试->获取($value1);抱歉,名称错误-编辑为“真实测试用例”:没有理由让它按照您希望的方式运行。不要这样写代码。PHP引用不是C指针,不要像对待它们那样对待它们。显式地将一件事分配给另一件事,不要依赖间接修改。因此,当我在那里存储一个巨大的数组时,唯一的方法是为每个调用方创建一个副本?数据不会通过传递到函数或从函数返回来自动复制。PHP比这更智能!谢谢,我现在很清楚为什么会有空值。请检查我编辑的问题。如何创建一个函数,它总是通过ref为每个调用方设置完全相同的值?我试图实现一个统一的“价值袋”功能。请看我在问题下的回答。也许你想返回一个对象?一个对象只有一个副本,除非它被显式克隆,这样它的行为会更像你想要的。谢谢你,现在我很清楚为什么会有空值。请检查我编辑的问题。如何创建一个函数,它总是通过ref为每个调用方设置完全相同的值?我试图实现一个统一的“价值袋”功能。请看我在问题下的回答。也许你想返回一个对象?一个对象只有一个副本,除非它被显式克隆,这样它的行为会更像您所希望的。