PHP函数区分大小写吗?如果不区分,那么……?

3
我在我的 PHP 代码中使用了很多函数,例如 UID(),user_getProfileImage() ... 等等。在 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 文件编码为“UTF-8 without BOM”(一如既往),有趣的是,即使使用相同的函数并在同一服务器上运行,另一个项目也可以正常工作。

谢谢。

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

更新(和解决方法):

  1. 不要在任何函数名称中使用大写字母"I"
  2. 或者
  3. 简单地使用 setlocale,像这样:setlocale(LC_TIME, "tr_TR.UTF-8") // 我只需要本地时间设置并使用了这个
  4. 如果你需要使用 LC_ALL,不要忘记将 LC_CTYPE 设置回 en_US,例如:

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

4个回答

3
这提示了出现了“I问题”,当PHP使用土耳其语环境(tr_TRtr_TR.utf8...)时,这种情况就会出现。在这种情况下,大小写不敏感的检查会失败,因为大写和小写字母“i”之间的检查失效了。
请参见https://bugs.php.net/18556 — “设置区域设置为'tr_TR'将类名转换为小写”。
您有几个解决方案:
  • 定义并使用同样大小写的字母(或者至少是字母“i”)来调用函数;大小写不重要。
  • 使用不受此(误)行为影响的区域设置。
后者更可取,因为通常只需要进行一个微小的更改即可解决所有问题。

1
非常感谢。实际上我自己解决了这个问题,因为我忘记了在哪里寻求帮助。 :) 但是我的解决方案与你的相同。谢谢。 - Kerem

1

这实际上是一个已知的错误,自2002年以来仍未修复!请参见{{link1:#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'); - Ismail

0
为什么项目在 Windows 上运行正常(我假设你已经设置了开发服务器 - LAMP),但在生产服务器上却不行?
我猜测生产服务器是运行在一个 Linux 发行版上的 Apache,所以另一个你需要检查的问题是你在脚本中“包含”的文件名是否完全正确(我的意思是,例如如果你在包含“Lib.php”,而文件名实际是“lib.php”,Windows 不会报错,并且“lib.php”将被正确包含,但在 Linux 上(即生产服务器)包含“Lib.php”将无法工作,因为文件名区分大小写。

1
什么?在 PHP 中,函数名是不区分大小写的:https://dev59.com/xG035IYBdhLWcg3wErvM#5643544 - bjauy
@bjauy - 没错,我已经更正了上面的部分,只有变量在 PHP 中是大小写敏感的(方法和函数也应该是大小写敏感的)。 - m1lt0n
@bjauy 你错了。PHP函数名称不区分大小写,只有变量名区分大小写。https://dev59.com/mXE85IYBdhLWcg3wgDlI#2749788 - Pier-Alexandre Bouchard
@Pier-alexandreBouchard 但这正是不区分大小写的意思。 - bjauy
@bjauy 对不起,我从来没有在不区分大小写的情况下看到过IN。是我的错,抱歉! - Pier-Alexandre Bouchard

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接