为什么php抱怨在这段代码中通过引用传递?

时间:2009-10-14 02:05:42

标签: php

$test = 'love';
$eff = end(explode('ov',$test));

我无法弄明白;奇怪的是,这不会引起抱怨:

$test = 'love';
$eff = current(explode('ov',$test));

我得到的错误是: 严格:只应通过引用传递变量

4 个答案:

答案 0 :(得分:5)

end通过将数组的内部指针移动到数组的末尾来更改它。因此,该参数必须是可变的(即对数组的引用)才能使该操作有用。这就是您收到警告的原因。

current根本不接触阵列;它只看数组。因此,参数不需要是可变的(因此可以通过值传递)并且操作不会给出警告。

答案 1 :(得分:2)

explode返回一个临时数组,您不是“存储”到变量,而是直接传递给需要引用的end

我认为current不会触发错误的原因是它不会发生变异。其他变异函数如array_unshiftreset也会抱怨。

答案 2 :(得分:2)

end()通过引用修改传递给它的数组。首先将爆炸分配给变量,以便end()具有可以修改的引用。

$test = 'love';
$explosion = explode('ov',$test);
$eff = end($explosion);

end()只更改内部指针,因此无论如何都不会修改数组的内容,除非您使用current()each(),否则您不会注意到,迭代次数为next()

如果end()的这种限制令你烦恼,可以采用一些方法:

function last($array) { return end($array); }
$test = 'love';
$eff = last(explode('ov', $test));

答案 3 :(得分:0)

<?php

error_reporting(E_STRICT);

$test = 'love';
$eff = end(explode('ov',$test));
var_dump($eff);

?>

如果您的错误报告级别未设置为E_STRICT,它将正常工作。

请注意,当您返回临时数组时,您不能像这样设置内部指针。您需要先将其设置为变量,然后使用end()将内部指针移动到末尾。

对于reset()next()prev()等等,情况确实如此。

以下内容可行。

<?php

error_reporting(E_STRICT);

$test = 'love';
$a = explode('ov',$test);
$eff = end($a);
var_dump($eff);

?>

current()有效,因为它不会移动内部指针,而是获取内部指针指向的当前元素。