#php #namespaces #autoload #spl-autoload-register
#php #пространства имен #автозагрузка #spl-автозагрузка-регистрация
Вопрос:
в принципе, у меня следующая проблема: я хочу использовать новые возможности пространства имен PHP. К сожалению, я использую версию PHP (5.3.2), в которой поддержка автозагрузки пространства имен для Linux по-прежнему кажется глючной и не работает (PHP должен иметь возможность автоматически загружать файл класса по своему пространству имен без использования пользовательского автозагрузчика, но это не работает).
Чего я хочу добиться, так это написать автозагрузчик, который я могу просто удалить, как только функции пространства имен php будут работать правильно (кажется, есть преимущество в скорости, когда не используется пользовательский автозагрузчик), с необходимостью впоследствии изменять как можно меньше кода.
Итак, у меня есть вызов, подобный этому:
$filereader = new systemlibrariesfileXML();
который будет правильно передан в виде строки «system libraries file XML» моей функции автозагрузки. Я могу загрузить соответствующий файл «system/libraries/file/XML.class.php «. Однако класс в нем будет назван
class XML { ... }
(или что-то другое, чем «system libraries file XML»), и поэтому иметь имя, отличное от того, с помощью которого PHP попытается его загрузить. Итак, есть ли простой способ загрузить этот класс («XML»), имя которого отличается от имени, которое я передаю функции автозагрузчика? Могу ли я, возможно, что-то сделать в автозагрузчике для достижения такого поведения? (Я использую spl_autoload_register).
Я знаю, что даже если бы это сработало, я все равно не смог бы использовать все возможности пространства имен, поскольку (простой) автозагрузчик не соблюдал бы директиву «использовать пространство имен», и мне все равно пришлось бы использовать довольно длинные имена для загрузки класса. Однако, если я правильно понял особенности пространства имен PHP, я мог бы оставить код как есть, когда позже переключусь на использование собственной поддержки пространства имен вместо моего автозагрузчика.
Если то, что я пытаюсь сделать, на ваш взгляд, вообще не имеет смысла или если я неправильно понял пространства имен, пожалуйста, скажите мне (- Я еще не использовал возможности PHP для именования).
Комментарии:
1. Что вы уже пробовали в своем автозагрузчике? Я думаю, что это должно работать даже в этой версии php. Кстати, поскольку вы упомянули Linux, вы должны отметить, что все имена файлов чувствительны к регистру.
2. Спасибо, я знаю, что в Linux пути — ci, но это не проблема, насколько я вижу. Автозагрузчик просто проверяет строку, которую он получает, и загружает соответствующий файл через require_once, поэтому он не выполняет ничего, кроме обычных действий.
Ответ №1:
Я бы загрузил файл (который создает XML
класс), а затем присвоил бы XML
классу псевдоним с соответствующим пространством имен systemlibrariesfileXML
class:
class_alias('XML', 'systemlibrariesfileXML');
В более общем плане:
class_alias(basename($class), $class));
Хотя я не совсем уверен, class_alias
может ли быть псевдоним для классов с пространством имен…
Комментарии:
1. Это возможно, но в настоящее время я не знаю, требует ли это (возможно) полных имен (начинающихся с «). Насколько я помню, имена классов в строках всегда обрабатываются как полные. Таким образом, ваш пример должен сработать.
2. Я попробую это позже. Выглядит многообещающе. Я не знал о функции class_alias, так что это было определенно полезно.
3. Работает. Спасибо. Однако, все еще одна вещь, которая беспокоит меня по поводу моей попытки вообще: строго говоря, «system libraries file XML» не является допустимым именем переменной, поэтому я предполагаю, что это также недопустимое имя класса. Я не уверен, может ли это вызвать проблемы где-нибудь … ?