Загрузить класс с именем, отличным от имени, переданного автозагрузчику в качестве аргумента

#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» не является допустимым именем переменной, поэтому я предполагаю, что это также недопустимое имя класса. Я не уверен, может ли это вызвать проблемы где-нибудь … ?