错误消息“严格标准:只有变量应通过引用传递”
$el = array_shift($instance->find(..))
上面的代码以某种方式报告了严格的标准警告,但这不会:
function get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
那么,它什么时候会报告警告呢?
$el = array_shift($instance->find(..))
上面的代码以某种方式报告了严格的标准警告,但这不会:
function get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
那么,它什么时候会报告警告呢?
请考虑以下代码:
error_reporting(E_STRICT);
class test {
function test_arr(&$a) {
var_dump($a);
}
function get_arr() {
return array(1, 2);
}
}
$t = new test;
$t->test_arr($t->get_arr());
这将生成以下输出:
Strict Standards: Only variables should be passed by reference in `test.php` on line 14
array(2) {
[0]=>
int(1)
[1]=>
int(2)
}
原因何在?该方法不是变量,在严格模式下,这将生成警告。此行为非常不直观,因为该方法返回数组值。test::get_arr()
get_arr()
若要在严格模式下解决此错误,请更改方法的签名,使其不使用引用:
function test_arr($a) {
var_dump($a);
}
由于您无法更改签名,因此也可以使用中间变量:array_shift
$inter = get_arr();
$el = array_shift($inter);
$instance->find()
返回对变量的引用。
当您尝试将此引用用作函数的参数时,您将获得报告,而无需先将其存储在变量中。
这有助于防止内存泄漏,并且可能会在下一个PHP版本中成为错误。
如果第二个代码块写得像这样,则会引发错误(请注意函数签名中的):&
function &get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
因此,快速(但不是那么好)的修复方法是:
$el = array_shift($tmp = $instance->find(..));
基本上,您首先对临时变量进行赋值,然后将该变量作为参数发送。