【发布时间】:2016-03-07 10:56:02
【问题描述】:
函数array_shift()通过引用获取一个参数。传递数组文字会导致致命错误:
$ php -r 'var_export(array_shift(array("Test #0"));';echo
致命错误:在第 1 行的命令行代码中只能通过引用传递变量
这如预期的那样失败。但是,当使用 call_user_func_array 调用函数时,PHP 的行为很奇怪:
<?php
var_export(call_user_func_array("array_shift", array(array("Test #1"))));
echo "\n";
$arg1 = array("Test #2");
var_export(call_user_func_array("array_shift", array($arg1)));
echo "\n";
$args = array(array("Test #3"));
var_export(call_user_func_array("array_shift", $args));
echo "\n";
执行时:
$ php test.php
'测试#1'
警告:array_shift() 的参数 1 应为参考,在第 6 行的 /Users/kcc/test.php 中给出值 空
警告:array_shift() 的参数 1 应为参考,在第 10 行的 /Users/kcc/test.php 中给出值 空
call_user_func_array() 不会触发致命错误是可以理解的,但是为什么第一个表单可以正常工作呢?
【问题讨论】:
-
这里应该是第三个右括号吗?
$ php -r 'var_export(array_shift(array("Test #0"));';echo -
我对内部结构了解不多,无法解释原因(尽管变量的存在似乎迫使 PHP 返回表达式的值,而不是对它的引用)......但是这已在 PHP7 中“修复”。您将收到所有三个警告。
-
只是猜测,但由于您使用的是 call_user_func_array,因此在调用 array_shift 时,第二个参数是函数中可用的变量。因此,您正在转移该变量,而不是文字数组值。定义
function test($a, $b){ $a($b); }的函数,如果在该函数中调用array_shift,$b是一个局部变量,而不是像array()这样的语言结构。因此,您将传递对局部变量的引用。
标签: php pass-by-reference php-internals