严格标准错误

Posted

技术标签:

【中文标题】严格标准错误【英文标题】:Strict standards error 【发布时间】:2011-10-07 06:15:25 【问题描述】:

函数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);

还是别的什么?

【问题讨论】:

制作a testcase. @Tomalak:看我对创世纪答案的评论 我看到了,已经回复了......它与测试用例有什么关系? return $this->parse_users($records)[0] 如果你愿意安装 php 5.4 ;) Strict Standards: Only variables should be passed by reference的可能重复 【参考方案1】:

就是这样。 reset 将数组的引用作为参数,所以它基本上需要一个真正的变量来引用——即使它是一个按引用传递的值。

【讨论】:

这显然是有道理的,因为它重置了数组参数。否则这是不可能的。 @hakre:没有太大意义的是 PHP 无法从函数表达式中获取引用。 @Tomalak Geret'kal:当然可以。可能被通知消息“误导”了:“严格标准:只有变量应该通过引用传递”。所以当它落地时,你很可能只想在你手头的变量上使用它。【参考方案2】:

你为什么不试试你的

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

?

没错

【讨论】:

我的代码似乎臃肿:P 认为这可能是错误的解决方案/有更好的解决方案。【参考方案3】:

单行解决方案使用一对额外的括号;这会将引用转换为变量并省略错误:

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

【讨论】:

是的,this works。我认为这很难被广泛认为是“良好做法”,因为我认为它并不广为人知。副手我想不出为什么这不是一个好的做法。 This does not work,事实上这会让你的代码失败并返回 Fatal Error in PHP 5.3。说真的,这里添加的这对括号应该如何真正使表达方式有所不同?编译优化肯定会放弃它。如果不是现在,那么在未来。 @hakre: Your version with array() 与the OP's version with function-call get_array() 相同。 array() 不是函数调用。我已经证明它确实适用于函数表达式。您关于优化将删除括号的论点是有缺陷的;你假设它们总是多余的,根本不考虑语言的语法。 @hakre:除 array() 语言结构之外的其他任何东西都有效:function foo()return array(); reset( ( foo() ) );(是的,也在 PHP 5.3 中)。不过,我会投票反对这个解决方案,因为它晦涩难懂,只会让代码库上的未来编码人员感到困惑。进行单独的获取和重置也将与流水线一样快。 @Wrikken:有些人使用-1 试图表示E_ALL | E_STRICT,但it's flawed(参见cmets)。【参考方案4】:

来自PHP documentation for reset:

混合复位(数组&$array)

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

PHP reset() 函数接受一个数组的引用。 之所以会引发严格警告,是因为您直接将 parse_users 的结果传递给重置,而无法在其他函数中访问该数组。

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

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

return $users;

或者,如果您只想要来自 parse_users 的第一个值,您可以使用:

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

仅当您遍历数组并希望确保从头开始时才需要重置功能。

【讨论】:

以上是关于严格标准错误的主要内容,如果未能解决你的问题,请参考以下文章

严格标准:Joomla 中的非静态方法错误

错误消息“严格的标准:只能通过引用传递变量”

Mysql connect 给出严格标准错误

文件上传中的严格标准错误

严格标准:mysqli_multi_query 出现 mysqli_next_result() 错误

使用 PHP 5.4 禁用 WordPress 3.7 中的严格标准错误