为通过引用传递的可选参数赋值
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
的值不受影响。
我只需要有人确认以下代码完全有效,尤其是在调用函数时未给出可选参数的情况下。事实上,在这种情况下,我会预料到一个异常,因为该函数试图分配一个未作为参数给出的变量。
<?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
的值不受影响。