根据PHP的文档class_exists()
不区分大小写。但是,我正在经历它。例如,class_exists("\\My\\Class")
返回true,但class_exists("\\My\\class")
返回false。
我正在运行PHP 5.3.3。我有两个独立的环境。这在一个环境中正常工作,但另一个环境表现得像关心案例。
我错过了什么?某处有配置设置吗?
更新
对于遇到此问题的其他人,我发现了这个问题。 class_exists()
将自动加载器用于尚未声明的任何类。只要该类出现在get_declared_classes()
返回的列表中,class_exists()
将表现为不区分大小写。但是,如果您要查找的类未显示在此列表中,则它依赖于已注册的自动加载器堆栈来查找它。我的项目使用的自动加载器是Symfony2的UniversalClassLoader,它最终依赖于file_exists()
来自动加载该类。 file_exists()
只要系统的环境区分大小写,就会区分大小写。这就是我在一个环境而不是另一个环境中看到问题的原因。有许多方法可以通过添加不区分大小写的自动加载器来解决此问题。在文档注释中还有一些不太敏感的file_exists()
实现的好例子。
我真诚地道歉,因为没有有效地传达问题并提供伪示例而不是实际代码而浪费每个人的时间。我的伪示例是一种分心,而不是我打算解决问题的核心。我失败了,为此我真的很抱歉。
答案 0 :(得分:14)
你是否将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默认情况下不区分大小写但保留大小写。