我只需要有人确认以下代码完全有效,尤其是在调用函数时未给出可选参数时。实际上,在这种情况下,我会预料到一个异常,因为函数试图分配一个未作为参数给出的变量。
<?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);
答案 0 :(得分:2)
PHP变量由两部分组成:名称和值。
声明
$v = 'abc';
生成如下数据结构:
+-----------+ +-------+
| v | --------> | 'abc' |
+-----------+ +-------+
v
是名称,'abc'
是值。
通过引用分配变量会为现有变量的内容生成新名称。作业:
$to_assign = &$v;
产生
+-----------+
| v | -----+
+-----------+ | +-------+
+--> | 'abc' |
+-----------+ | +-------+
| to_assign | -----+
+-----------+
当$to_assign
是函数myfunc()
的参数(通过引用传递)时,会发生类似的事情。唯一的区别是$to_assign
的名称存储在与$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
。
当使用单个参数调用函数时,默认值$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,没有创建局部变量。