为通过引用传递的可选参数赋值

Assign a value to an optional argument passed 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);

如果您希望将 78 作为默认值,那么最好这样做:

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

myfunc('hello');将回显 'hello', 78

myfunc('world',10);将回显 'world', 10

为了进一步调试,您可以将函数修改为:

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

首先,致电

myfunc('hello');

告诉你有 $to_assign 变量,它不是 reference。所以改变它的值将影响 nothing.

其次,如果

myfunc('world', $v);

你可以看到 vars 中的 $to_assign 是一个 reference 并且一切如你所愿: $v 的值更改为 78.

因此,在这两种情况下,您都有 $to_assign 变量,但它要么是参考,要么不是。是的,感谢@axiac,没有创建局部变量。

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

声明

$v = 'abc';

生成这样的数据结构:

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

v是名称,'abc'是值。

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

$to_assign = &$v;

产生:

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

$to_assign 是函数 myfunc() 的参数(通过引用传递)时,会发生类似的情况。唯一的区别是 $to_assign 的名称与 $v 的名称存储在不同的位置,并且它(名称)在函数 returns.

时被销毁

myfunc('world', $v)

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

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

语句 $to_assign = 78; 将值 'abc' 替换为 78,现在 $v 的值是 78。当函数returns时,局部变量$to_assign的(name)被销毁,但它的值(现在78)仍然被$v的名字引用;这就是它没有被摧毁的原因。调用myfunc('world', $v)后,$v的值为78.

myfunc('hello')

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

这是 myfunc('hello')

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

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

变量$to_assign现在是函数myfunc()的常规局部变量。语句 $to_assign = 78; 将值 NULL 替换为 78。当函数 returns 变量的名称 $to_assign 被销毁时,因为它的值(现在 78)成为孤儿(它没有被其他名称引用)它也被销毁。 $v 的值不受影响。