PHP函数区分大小写吗?

103

我在查看一些代码时,发现其中有调用mySQL_fetch_array的语句。PHP中的函数名是否区分大小写?我记得在某处读到过这个问题,但似乎找不到任何相关参考。


1
不,它们似乎不是。偏好通常为小写。 - Jason
3
重复的问题:https://dev59.com/mXE85IYBdhLWcg3wgDlI。不,函数是不区分大小写的。 - Bob Baddeley
参考信息:这个内容被埋藏在中间的这里 http://www.php.net/manual/en/functions.user-defined.php 的一个注意事项块中。 - mario
3
我投票支持保持开放状态——标题更加通用和明确,因此可以帮助更多的人。 - coreyward
你为什么不直接试一下呢? - zomega
8个回答

103

我引用自这里:

注意: 函数名大小写不敏感,但通常最好按照它们在声明中出现的方式来调用函数。

因此,看起来用户定义的函数不区分大小写,在 PHP5 中有一个投票支持将函数/对象区分大小写。


3
PHP5已经过时,你唯一的希望是PHP6,但我认为他们不会采取这个步骤。这样做会得不偿失。 - Mark Tomlin
4
我不同意。最佳实践是保持手册中的大小写一致,这样可以保持稳定性,同时提高清晰度。 - Ben Dauphinee
13
哇,那真是令人难过。虽然ImAgEcReAtEfRoMpNg()是一种不错的混淆代码的方式... - Pontomedon
8
由于引用中提到了“不区分大小写”,为什么您会说“因此似乎用户定义是区分大小写的”?如果这是错误,您确实应该进行更正。 - Barmar
15
哇!在编程七年后发现这真的很棒! - Daan
显示剩余7条评论

37

编号。

PHP函数不区分大小写


21

简而言之:类名不区分大小写,但在声明时始终使用相同的大小写(与函数相同)。另外,使用与定义时不同大小写实例化类可能会导致自动加载程序出现问题。


另外,类名不区分大小写:

<?php
class SomeThing {
  public $x = 'foo';
}

$a = new SomeThing();
$b = new something();
$c = new sOmEtHING();
var_dump($a, $b, $c);

这将输出:

class SomeThing#1 (1) {
  public $x =>
  string(3) "foo"
}
class SomeThing#2 (1) {
  public $x =>
  string(3) "foo"
}
class SomeThing#3 (1) {
  public $x =>
  string(3) "foo"
}

问题是使用自动加载器和大小写敏感的文件系统(例如ext2 / 3/4),这意味着您必须以与包含类的文件相同的大小写调用类名(而不是实际大小写形式),或者使用 strtolower

类文件:

<?php
// filename something.php
class SomeThing {
   ...
}

自动加载函数(__autoload 或者一个注册到 spl_autoload_register 的函数)

function my_autloader($className) {
  $filename = CLASSES_DIR . DIRECTORY_SEPARATOR . $className . '.php';
  if (file_exists($filename)) {
    require($filename);
  }
}

现在使用这段代码:

$a = new something(); // works
$b = new SomeThing(); // does not work
$c = new SOMETHING(); // does not work

如果您在自动加载器代码中添加了对 strtolower() 的调用,可能会使此工作(即具有有效的不区分大小写类名)。但是与函数一样,最好以与声明相同的方式引用类,在文件名中使用与类名相同的大小写形式,使用自动加载器,而不要使用 strtolower 等工具。


7
不,它们不区分大小写,但为了保持一致性,您应该始终使用手册中的大小写。然而,变量是区分大小写的。

5
方法名称也是不区分大小写的。例如:
<?php
       class C { 

           public function method() { } 

           public function METHOD() { } 
       }

输出:

PHP Fatal error:  Cannot redeclare C::METHOD() in ....php on line 6

4

在PHP中,变量是大小写敏感的,但函数不会出现这样的问题。你可以使用以下语句来显示输出,所有语句都将显示相同的结果。

<?php
Echo "This is a test script";
ECHO "This is a test script";
echo "This is a test script";
?>

另一方面,如果更改变量的大小写敏感性,则会显示错误。
示例:
<?php
$a=5;
echo $A;// It will show the error.
?>

输出:

Notice: Undefined variable: A in C:\xampp\htdocs\test.php on line 3

2
总结大家的回答,尽管PHP5至今仍然没有要求在所有情况下都保持字符大小写一致性。
最佳实践是:
始终在引用变量(必须)或函数(可选,但建议)时使用相同的大小写。
你永远不知道,也许有一天这个提案会通过,那么你就可以避免在几年前制作的需要更新PHP应用程序中更改大小写的噩梦。
希望对你有所帮助。

关于“避免整个更改大小写的噩梦”的问题:不,我的理解是,如果进行更改,大小写敏感性将成为一个选项,在php.ini中设置。从而保持向后兼容性。 - ToolmakerSteve

-2
也许现在已经有点晚了,但是...
大家都已经知道:PHP引擎不关心字母的大小写。
而且在PHP bugtracker上有一个投票,大多数人都说:“是的,我支持大小写敏感”。
但是我反对,因为在我的MVC框架中,我调用控制器操作:
    $currentController = new $controller($parameters);
    $currentAction = $currentController->{$action}();

$controller和$action将直接从URL中获取。

想象一下,如果用户发布了一个指向我的网站的链接: https://my-site/MyPartnerController/MyPartnerGallery

而类名为myPartnerController...

这意味着如果PHP的类和函数名称区分大小写,那么没有人能够访问此页面。

是的,我总是在代码中使用声明的所有名称。但我祈祷他们永远不会使函数和类的名称区分大小写。

谢谢!


2
这真的很糟糕...如果我访问http://my-site/myLogInPage/loginsuccess,并猜测您称之为登录成功函数的名称,那么我就可以进入系统或删除一些内容... - Tschallacka

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