15

根据 PHP 的文档class_exists()是不区分大小写的。但是,我正在经历它。例如,class_exists("\\My\\Class")返回 true 但class_exists("\\My\\class")返回 false。

我正在运行 PHP 5.3.3。我有两个不同的环境。这在一个环境中正常工作,但另一个环境的行为就像它关心大小写一样。

我错过了什么?某处有配置设置吗?

更新:

对于其他遇到此问题的人,我发现了问题。class_exists()对任何未声明的类使用自动加载器。class_exists()只要类出现在get_declared_classes(). 但是,如果您要查找的类没有出现在此列表中,则它依赖于注册的自动加载器堆栈来找到它。我的项目使用的自动加载器是 Symfony2 的 UniversalClassLoader,它最终依赖于file_exists()自动加载类。file_exists()只要系统环境区分大小写,就区分大小写。这就是为什么我在一种环境而不是另一种环境中看到问题的原因。有很多方法可以通过添加不区分大小写的自动加载器来解决这个问题。还有一些不区分大小写的好例子file_exists()文档注释中的实现。

对于没有有效地传达问题并提供伪示例而不是实际代码而浪费大家的时间,我深表歉意。我的伪示例不是我想要解决问题的核心,而是分散注意力。我失败了,为此我真的很抱歉。

4

1 回答 1

16

您是否将 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 默认情况下不区分大小写但会保留大小写。

于 2013-03-19T08:41:53.947 回答