严格标准错误
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 witharray()
不与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];
仅当您遍历数组并希望确保从头开始时才需要重置功能。
【讨论】:
以上是关于严格标准错误的主要内容,如果未能解决你的问题,请参考以下文章