如果我使用
strtolower(end(explode('.',$_FILES['file']['name'])));
它给我错误
PHP严格标准:只应通过引用传递变量
我认为我只是先将值存储在变量中,然后使用explode
$filename = $_FILES['file']['name']; $filearray = explode('.',$filename);
它工作正常
但我有另一条线
strtolower(end($filearray));
我认为它应该给我同样的错误,我的意思是我首先应该存储end($filearray)
在一个变量然后使用该变量strtolower()
,
但这并没有给我任何错误,那么为什么strtolower()
接受一个函数作为参数,而不是给出错误,有人可以解释为什么?
它不是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));