【问题标题】:Are PHP functions case-sensitive, if not...?PHP函数是否区分大小写,如果不是......?
【发布时间】:2012-05-23 17:21:02
【问题描述】:

我在我的 PHP 代码中使用了很多这样的函数; UID(), user_getProfileImage() ... etc。我正在 Windows 上编写我所有的项目并且运行良好。在这里还可以,但是当我将项目放在服务器上时,它会出现这样的错误;

Fatal error: Call to undefined function UID() in /var/www/vhosts/...

什么?它是未定义的吗?!

我正在检查我的所有项目文件并将所有文件再次通过 FTP 传输到服务器,再次......同样的错误。

但是当我将 UID() 的名称更改为 uid()(在 lib.php 和其他使用它的地方)时,它运行良好。

那么问题是什么?这台服务器怎么了?

本地 PHP 版本:5.3.10

服务器 PHP 信息:http://... 已删除

注意:我使用 Notepad++ 将所有 PHP 文件编码为“没有 BOM 的 UTF-8”(一如既往),有趣的是,其他项目运行良好,即使使用相同的功能并在同一台服务器上运行。

谢谢。

/##############################/

更新(和解决方案);

  1. 不要在任何函数名中使用“I”(大写“i”)字符 或
  2. 像这样简单地使用 setlocale; setlocale(LC_TIME, "tr_TR.UTF-8") // 我只需要语言环境时间配置并使用它
  3. 如果你需要LC_ALL,别忘了在en_US中设置回LC_CTYPE,即:

    setlocale(LC_ALL, "tr_TR.UTF-8"); setlocale(LC_CTYPE, "en_US");

【问题讨论】:

    标签: php linux


    【解决方案1】:

    这暗示着遭受“我的问题”,当 PHP 使用土耳其语语言环境(tr_TRtr_TR.utf8...)时,它就会表现出来。这样做时,大小写字母“i”之间的不区分大小写检查失败。

    参见 https://bugs.php.net/18556 —“将语言环境设置为 'tr_TR' 小写类名”


    你有几个解决方案:

    • 使用大小写相同的字母(或者,至少是字母“i”)定义和调用您的函数;高低不重要。
    • 使用不受此(错误)行为影响的语言环境。

    后者是首选,主要是因为它通常是一个微小的变化修复所有问题的任务。

    【讨论】:

    • 非常感谢。实际上我自己解决了这个问题,因为我忘记了我在哪里写的求助。 :) 但解决方案与您的相同。谢谢。
    【解决方案2】:

    它实际上是已知的错误,但自 2002 年以来仍未修复!见#18556

    简而言之,PHP 使用内部tolower() 函数,该函数可识别区域设置,但在土耳其语中,I 有一些特定规则(不带点的 ı 是 I 的小写,带点的 İ 是 i 的大写)。因此,如果您的方法名称的类名称具有大写 I(newInstanceArgs、Image 等),您就会受到影响。

    目前唯一的解决方法似乎是将LC_CTYPE 设置为某些工作区域,例如。

    setlocale(LC_ALL, 'tr_TR');
    setlocale(LC_CTYPE, 'en_US');
    

    【讨论】:

    • 谢谢,这确实解决了问题。您应该使用 UTF-8 编码来避免任何奇怪的字符输出 setlocale(LC_CTYPE, 'en_US.UTF-8');
    【解决方案3】:

    为什么项目在 Windows 上正常运行(我想你已经设置了开发服务器 - LAMP)而不是在实时服务器上?

    我认为实时服务器是 Linux 发行版上的 Apache,因此您应该做的另一项检查是您在脚本中“包含”的文件是确切的文件名(我是说这个,例如,如果您包含文件名为“lib.php”的“lib.php”不会在windows中引发任何错误,“lib.php”将正常包含,但在linux(即实时服务器)中包含“lib.php” " 不起作用,因为文件名区分大小写。

    【讨论】:

    • 嗯? PHP 中的函数名不区分大小写stackoverflow.com/a/5643544/729077
    • @bjauy - 没错,我已经更正了上面的这一部分,只有变量在 php 中区分大小写(方法和函数也应该区分大小写)
    • @bjauy 你错了。 PHP 函数名不区分大小写。只有变量名称区分大小写。 stackoverflow.com/a/2749788/837765
    • @Pier-alexandreBouchard 但这正是不区分大小写的意思
    • @bjauy 对不起,我从来没有看到不区分大小写的 IN。我的错,对不起!
    【解决方案4】:

    在 Linux 上,文件名区分大小写,因此我猜测您的 UID() 函数位于名称包含错误的文件或文件夹中。检查所有脚本中所有 require、require_once、include、include_once 语句的完整路径的字符大小写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 2023-04-08
      • 2011-03-27
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      相关资源
      最近更新 更多