如果我使用
strtolower(end(explode('.',$_FILES['file']['name'])));
它给我错误
PHP严格标准:只应通过
中的引用传递变量
我认为我只是先将值存储在变量中,然后使用explode
$filename = $_FILES['file']['name'];
$filearray = explode('.',$filename);
并且工作正常
但我有另一条线
strtolower(end($filearray));
我认为它应该给我同样的错误,我的意思是我应该首先将end($filearray)
存储在变量中然后在strtolower()
中使用该变量,
但这并没有给我任何错误,所以为什么strtolower()
接受一个函数作为参数,而不是给出错误,有人可以解释原因吗?
答案 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 函数只是一个普通的参数。
那么为什么结束函数会获得引用? 结束不仅会返回最后一个元素,还会将数组的内部指针移动到最后一个元素。因此,如果您在结束功能后调用当前功能,您将获得最后一个元素。 所以基本上结束函数会修改参数中传递的数组。因此它需要是一个可以修改的变量作为参考。