为什么strtolower()不遵循PHP严格标准

时间:2017-01-13 07:42:02

标签: php strict

如果我使用

strtolower(end(explode('.',$_FILES['file']['name'])));

它给我错误

  
    

PHP严格标准:只应通过

中的引用传递变量   

我认为我只是先将值存储在变量中,然后使用explode

 $filename = $_FILES['file']['name'];
 $filearray = explode('.',$filename);

并且工作正常

但我有另一条线

strtolower(end($filearray));

我认为它应该给我同样的错误,我的意思是我应该首先将end($filearray)存储在变量中然后在strtolower()中使用该变量,

但这并没有给我任何错误,所以为什么strtolower()接受一个函数作为参数,而不是给出错误,有人可以解释原因吗?

2 个答案:

答案 0 :(得分:5)

strtolower不是end提供警告 - 而是end功能。引用docs

  

end()使数组的内部指针前进到最后一个元素,和   返回其值。 [...]数组是通过引用传递的,因为它   由函数修改。这意味着你必须传递真实   变量而不是返回数组的函数,因为只有实际的   变量可以通过引用传递。

在您的第一个示例中,您尝试explode strtolower调用的结果 - 即,不是真正的变量。虽然PHP可以忽略这样的用例,但通常意味着您已经错误地完成了某些操作 - 并且E_STRICT警告会尝试通知您。

您的第三个示例正常,因为:

1)end实际上并不关心参考。 返回一个字符串,其中所有字母字符都转换为小写,而不是修改字符串。

2)current有一个变量 - 数组 - 传入。它返回它的最后一个元素,同时将该数组的内部指针推进到它的结尾。您是否尝试使用此内部指针(使用explode(end()或其他方式),您会看到差异。

作为旁注(已在@DoktorOSwaldo的评论中提及),您可以使用简单pathinfo调用替换所有$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION)); 内容:

Gson gson = new Gson();

答案 1 :(得分:1)

因为php中的某些函数是作为引用传递的。 结束是其中一项功能。见doc:http://php.net/manual/en/function.end.php

但是 strtolower 函数只是一个普通的参数。

那么为什么结束函数会获得引用? 结束不仅会返回最后一个元素,还会将数组的内部指针移动到最后一个元素。因此,如果您在结束功能后调用当前功能,您将获得最后一个元素。 所以基本上结束函数会修改参数中传递的数组。因此它需要是一个可以修改的变量作为参考。