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

beg*_*ner 1 php strict

如果我使用

strtolower(end(explode('.',$_FILES['file']['name'])));
Run Code Online (Sandbox Code Playgroud)

它给我错误

PHP严格标准:只应通过引用传递变量

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

 $filename = $_FILES['file']['name'];
 $filearray = explode('.',$filename);
Run Code Online (Sandbox Code Playgroud)

它工作正常

但我有另一条线

strtolower(end($filearray));
Run Code Online (Sandbox Code Playgroud)

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

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

rai*_*7ow 5

它不是strtolower给你警告 - 而是end功能.引用文档:

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

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

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

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

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


作为旁注(已在@DoktorOSwaldo的评论中提到),您可以explode(end()使用简单的pathinfo调用替换所有内容:

$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
Run Code Online (Sandbox Code Playgroud)