为引用

时间:2017-09-06 12:54:02

标签: php pass-by-reference

我只需要有人确认以下代码完全有效,尤其是在调用函数时未给出可选参数时。实际上,在这种情况下,我会预料到一个异常,因为函数试图分配一个未作为参数给出的变量。

<?php

function myfunc($msg, &$to_assign=null)
{
    echo "$msg\n";
    $to_assign = 78;
}

myfunc('hello'); // <== Is it valid to assign 78 to nothing?
myfunc('world', $v);

3 个答案:

答案 0 :(得分:2)

PHP变量由两部分组成:名称和值。

声明

$v = 'abc';

生成如下数据结构:

    +-----------+           +-------+
    | v         | --------> | 'abc' |
    +-----------+           +-------+

v是名称,'abc'是值。

通过引用分配变量会为现有变量的内容生成新名称。作业:

$to_assign = &$v;

产生

    +-----------+
    | v         | -----+
    +-----------+      |    +-------+
                       +--> | 'abc' |  
    +-----------+      |    +-------+
    | to_assign | -----+
    +-----------+

$to_assign是函数myfunc()的参数(通过引用传递)时,会发生类似的事情。唯一的区别是$to_assign的名称存储在与$v名称不同的位置,并且当函数返回时,它(名称)将被销毁。

myfunc(&#39; world&#39;,$ v)

这是myfunc('world', $v)执行期间数据结构的样子:

    +-----------+
    | v         | -----------+
    +-----------+            |    +-------+
                             |--> | 'abc' |  
.== myfunc('world', $v) ==.  |    +-------+
|   +-----------+         |  |
|   | to_assign | ----------+
|   +-----------+         |
|   +-----------+         |       +---------+
|   | msg       | --------------> | 'world' |
|   +-----------+         |       +---------+
+=========================+

语句$to_assign = 78;'abc'替换为78,现在$v的值为78。当函数返回时,局部变量$to_assign的(名称)被销毁,但其值(现在78)仍被$v的名称引用;这就是它没有被摧毁的原因。致电myfunc('world', $v)后,$v的值为78

MYFUNC(&#39;你好&#39)

当使用单个参数调用函数时,默认值$to_assign用于初始化它。

这是调用myfunc('hello')

期间数据结构的样子
    +-----------+                 +-------+
    | v         | --------------> | 'abc' |  
    +-----------+                 +-------+

.==== myfunc('hello') ====.   
|   +-----------+         |       +------+
|   | to_assign | --------------> | NULL |
|   +-----------+         |       +------+
|   +-----------+         |       +---------+
|   | msg       | --------------> | 'hello' |
|   +-----------+         |       +---------+
+=========================+

变量$to_assign现在是函数myfunc()的常规局部变量。声明$to_assign = 78;NULL替换为78。当函数返回时,变量$to_assign的名称被销毁,并且因为它的值(现在78)变为孤立(它没有被其他名称引用),它也被销毁。 $v的值不受影响。

答案 1 :(得分:-1)

如果你想让78成为你的默认值,那么最好这样做:

function myfunc($msg, $to_assign=78)
{
    echo "$msg\n";
    echo $to_assign;
}

MYFUNC( '你好');将回应'你好',78

MYFUNC( '世界',10);将呼应'世界',10

答案 2 :(得分:-1)

如需进一步调试,您可以将功能修改为:

function myfunc($msg, &$to_assign=null)
{
    var_dump(get_defined_vars());
    echo "$msg\n";
    $to_assign = 78;
}

首先,致电

myfunc('hello');

向您显示$to_assign变量,而不是参考。因此,改变它的价值会影响没有

第二,如果是

myfunc('world', $v);

您可以看到vars中的$to_assign参考,并且每个人都按预期工作:$v的值更改为78

因此,在这两种情况下,您都有$to_assign变量,但它或者是引用。是的,多亏了@axiac,没有创建局部变量。