你是在将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 默认情况下是不区分大小写但保留大小写特性。