当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么strtolower()不遵循PHP严格标准》经验,为你挑选了1个好方法。

如果我使用

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

它给我错误

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

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

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

它工作正常

但我有另一条线

strtolower(end($filearray));

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

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



1> raina77ow..:

它不是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));

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有