【问题标题】:Why strtolower() does not follow the PHP strict Standard为什么 strtolower() 不遵循 PHP 严格标准
【发布时间】:2017-05-28 12:43:18
【问题描述】:

如果我使用

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

它给我错误

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

我想我只是先将值存储在变量中,然后使用爆炸

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

效果很好

但是我还有一条线

strtolower(end($filearray));

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

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

【问题讨论】:

  • 顺便说一句:完全题外话,但raina77ow 已经给了你一个正确的答案。但是请查看您的案例的路径信息 => pathinfo($_FILES["file"]["name"])。为您提供一个包含所有您需要的数组(目录名、文件名、扩展名和基本名)php.net/manual/de/function.pathinfo.php

标签: php strict


【解决方案1】:

发出警告的不是strtolower,而是end 函数。引用docs

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

在您的第一个示例中,您尝试 end 调用 explode 的结果 - 即,不是真正的变量。虽然 PHP 可能会忽略这样的用例,但它通常意味着您错误地做了某事 - 并且 E_STRICT 警告会尝试通知您。

您的第三个示例运行良好,因为:

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

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


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

$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));

【讨论】:

  • 然后strtolower 被接收函数作为参考。怎么不报错?你能详细说明一下吗?
  • 它没有收到函数。它接收到函数调用的结果——$filearray 的最后一个元素。与此同时,$filearray 的内部指针已移至其最后一个元素。
【解决方案2】:

因为php中有些函数是作为引用传递的。 end 是这些功能之一。见文档:http://php.net/manual/en/function.end.php

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

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

【讨论】:

    猜你喜欢
    • 2017-01-07
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2010-10-06
    相关资源
    最近更新 更多