Согласно документации PHP, class_exists()
не чувствителен к регистру. Тем не менее, я переживаю, что это так. Например, class_exists("\\My\\Class")
возвращает true, но class_exists("\\My\\class")
возвращает false.
Я запускаю PHP 5.3.3. У меня две отдельные среды. Это работает правильно в одной среде, но другая среда действует так, как будто она заботится о случае.
Что мне не хватает? Есть ли настройка конфигурации где-нибудь?
ОБНОВИТЬ:
Для всех, кто испытывает эту проблему, я нашел проблему. class_exists()
использует автозагрузчик для любых классов, которые не были объявлены. class_exists()
будет вести себя как нечувствительный к регистру, пока класс появляется в списке, возвращаемом get_declared_classes()
. Однако, если класс, который вы ищете, не отображается в этом списке, он полагается на зарегистрированный стек автозагрузчика, чтобы найти его. Автозагрузчик, который использует мой проект, – это UniversalClassLoader от Symfony2, который в конечном итоге полагается на file_exists()
для автозагрузки класса. file_exists()
IS чувствителен к регистру, если среда системы чувствительна к регистру. Вот почему я видел проблему в одной среде, а не в другой. Существует много способов решить эту проблему, добавив автозагрузчик, который не чувствителен к регистру. В комментариях к документации есть также несколько хороших примеров некоторых нечувствительных к регистру file_exists()
.
Я искренне приношу извинения за то, что тратил время каждого, не передавая проблему и не предоставляя псевдо-пример вместо фактического кода. Вместо моего намерения добраться до сути моей проблемы, мой псевдо-пример был отвлечением. Я потерпел неудачу и для этого мне действительно жаль.
Вы сравниваете 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, по умолчанию, нечувствителен к регистру, но сохраняет регистр.