严格标准错误

5

parse_users函数返回一个数组。

我在另一个函数中执行以下操作:

return reset($this->parse_users($records));

但我收到了一个“Strict Standards: Only variables should be passed by reference in...”的错误提示。

这是因为我在函数上执行了“reset()”操作吗?

我必须按照以下方式做吗:

$users = $this->parse_users($records);
return reset($users);

还是有其他问题吗?

制作测试用例 - Lightness Races in Orbit
@Tomalak:请看我对Genesis答案的评论。 - PeeHaa
我看到过那个问题并已经回复了... 它与测试用例有什么关系? - Lightness Races in Orbit
如果您愿意安装PHP 5.4,那么请返回 $this->parse_users($records)[0] - NikiC
可能是重复的问题:Strict Standards: Only variables should be passed by reference - Lorenz Meyer
4个回答

5

确实如此。 reset 以数组的引用作为参数,因此它基本上需要一个真正的变量作为引用--即使它是按引用传递的值。


这是显而易见的,因为它重置了数组参数。否则这是不可能的。 - hakre
2
@hakre:不太合理的是,PHP无法从函数表达式中获取引用。 - Lightness Races in Orbit
@Tomalak Geret'kal:完全正确,就是这样。可能是由于通知消息的误导性而产生了困惑:“严格标准:只有变量应该通过引用传递”。因此,当它落到实处时,您很可能只想在手头上有的变量上使用它。 - hakre

3

why didn't you try your

$users = $this->parse_users($records);
return reset($users);

?

It's correct


似乎让我的代码变得臃肿:P 也许这不是正确的解决方案/还有更好的解决方案。 - PeeHaa

3
一行解决方案使用附加的一对括号将引用转换为变量并省略错误。
return reset( ( $this->parse_users($records) ) );

2
是的,这个可以工作。我认为这很难被广泛认为是“良好的实践”,因为我不认为它是广为人知的。我一时想不出为什么它不是好的实践。 - Lightness Races in Orbit
2
这个不起作用(http://codepad.viper-7.com/HMuHTu),事实上,这会导致您的代码出现**[PHP 5.3致命错误](http://codepad.viper-7.com/HMuHTu)**。而且,说真的,这里加上一对括号真的会在表达式方面有所区别吗?编译优化肯定会将其删除。如果现在没有删除,那么将来也会删除。 - hakre
2
@hakre: 使用array()的您的版本原帖中使用函数调用get_array()的版本不同的。array()不是一个函数调用。我已经证明它可以用于函数表达式。您认为优化会删除括号的论点是有缺陷的;您假设它们总是多余的,完全没有考虑语言的语法。 - Lightness Races in Orbit
2
@hakre:除了一个裸的array()语言结构之外,这个函数可以工作:function foo(){return array();} reset( ( foo() ) );(是的,在PHP 5.3中也是如此)。尽管如此,我会反对这种解决方案,因为它的晦涩性只会让未来的程序员在代码库上感到困惑。进行单独的获取和重置与将它们进行流水线处理一样快。 - Wrikken
2
@Wrikken:有些人使用“-1”来表示“E_ALL | E_STRICT”,但是这是有缺陷的(请参见评论)。 - Lightness Races in Orbit
显示剩余12条评论

1

来自PHP reset函数文档

mixed reset ( array &$array )

reset() 函数将数组的内部指针倒回到第一个元素并返回第一个数组元素的值。

PHP reset() 函数接受一个引用数组。 严格警告是因为您直接将 parse_users 的结果传递给 reset,而没有办法在其他函数中访问该数组。

如果您想在重置后返回完整的数组(而不仅仅是第一个值),则应使用:

$users = $this->parse_users($records);
reset($users);

return $users;

或者,如果你只想要从parse_users中获得第一个值,你可以直接使用:

$users = $this->parse_users($records);
return $users[0];

仅当您迭代数组并希望确保从开头开始时,才需要重置函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接