class_exists() 函数是否区分大小写?

17
根据PHP文档class_exists()是不区分大小写的。然而,我发现它是区分大小写的。例如,class_exists("\\My\\Foo")返回true,但class_exists("\\My\\foo")返回false。
我正在运行PHP 5.3.3。我有两个不同的环境。其中一个环境可以正常运作,但另一个环境好像关心大小写。
我错过了什么?是否有某个配置设置?

5
哪个系统?你有自动加载吗?这在Unix系统上可能很正常(文件对大小写敏感),特别是当有自动加载时(在尝试加载类之前,php还不知道它的存在)。 - julp
1
这个例子写得不好。你不能有一个叫做"class"的类。 - None
2
无法重现:http://eval.in/13037。请更新您的问题,提供更清晰的信息以便解决问题。 - Gordon
我只是以“Class”作为示例,抱歉,请假装我用“Foo”作为类名。如果相关的话,实际的类名是“Link”。该程序所在的环境为: Darwin 12.2.1 Darwin Kernel Version 12.2.1: root:xnu 2050.20.9~2/RELEASE_X86_64 x86_64显示区分大小写的环境为: Linux 2.6.32-220.el6.x86_64 x86_64 x86_64 x86_64 GNU/Linux虽然有autoload机制,但是它通过Symfony 2.0.9处理。代码库和自动加载程序在两个系统上都是相同的。 - Luke Cordingley
2
我认为这个问题写得相当好,它立即解决了我的问题。我唯一的抱怨是当你说“两个不同的环境”时最好给它们命名(只需添加“Mac OS可用,Linux不可用”),而且答案已经被编辑到问题中,而不是发布为自我回答。 “我真诚地道歉”这一点是完全不必要的。 - rjmunro
1个回答

19

你是在将Windows/Mac与Linux进行比较吗?

假设文件 Wooby\Dooby\Foo.php 存在,并且包含以下内容:

<?php
namespace Wooby\Dooby;

class Foo {}

类名不区分大小写

如果一个类已经存在,无论你使用什么大小写引用它,该类都会被找到:

<?php

require "Wooby/Dooby/Foo.php";

echo "Class Wooby\\Dooby\\foo does " . (class_exists("Wooby\\Dooby\\foo") ? '' : "NOT") . " exist\n";
echo "Class wooby\\dooby\\foo does " . (class_exists("wooby\\dooby\\foo") ? '' : "NOT") . " exist\n";
echo "Class Wooby\\Dooby\\Foo does " . (class_exists("Wooby\\Dooby\\Foo") ? '' : "NOT") . " exist\n";

运行上面的测试文件将返回:

-> php index.php 
Class Wooby\Dooby\foo does  exist
Class wooby\dooby\foo does  exist
Class Wooby\Dooby\Foo does  exist

文件系统是区分大小写的

如果一个类不存在并且你使用自动加载器,那么大小写确实很重要。考虑将上面的示例修改为使用简单的自动加载器:

<?php
ini_set('display_errors', 0);

function __autoload($name) {
    $file = str_replace('\\', '/', $name) '.php';
    if (file_exists($file)) {
        include $file;
    }
}

echo "Class Wooby\\Dooby\\foo does " . (class_exists("Wooby\\Dooby\\foo") ? '' : "NOT") . " exist\n";
echo "Class wooby\\dooby\\foo does " . (class_exists("wooby\\dooby\\foo") ? '' : "NOT") . " exist\n";
echo "Class Wooby\\Dooby\\Foo does " . (class_exists("Wooby\\Dooby\\Foo") ? '' : "NOT") . " exist\n";

结果将会是:

-> php index.php 
Class Wooby\Dooby\foo does NOT exist
Class wooby\dooby\foo does NOT exist
Class Wooby\Dooby\Foo does  exist

由于自动加载程序正在寻找与缺失类名匹配的路径,因此只有最后一个条目会触发包含文件并加载类。

除非您使用的是Windows或Mac1,它们都使用不区分大小写的文件系统。

总结

在 PHP 中,类名不区分大小写,但您的代码可能具有文件系统的区分大小写特性。显然,最好使用一致的大小写,并且不要依赖 PHP 来纠正懒惰的开发习惯。

请注意,class_exists 有一个参数可以打开或关闭(默认为打开)在查找不存在的类时使用自动加载程序。

脚注

1 更准确地说,HFS 默认情况下是不区分大小写但保留大小写特性。


2
这最终成为了一个问题,它被埋在一个自动加载器中,我错误地认为它是不区分大小写的。谢谢。 - Luke Cordingley

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