您是否将 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 或 mac 1都使用不区分大小写的文件系统。
概括
php 中的类名不区分大小写,但您的代码可能是因为它有效地继承了文件系统的区分大小写。显然最好使用一致的大小写,不要依赖php纠正懒惰的开发习惯。
请注意,class_exists有一个参数可以在查找不存在的类时打开或关闭(默认情况下打开)自动加载器的使用。
脚注
1更准确地说,HFS 默认情况下不区分大小写但会保留大小写。