Загрузить класс с именем, отличным от того, который передан автозагрузчику в качестве аргумента - PullRequest
1 голос
/ 28 мая 2011

В основном у меня следующая проблема: я хочу использовать новые возможности пространства имен PHP. К сожалению, я использую версию PHP (5.3.2), в которой поддержка пространства имен-autoload для linux по-прежнему кажется глючной и не работает (PHP должен иметь возможность автоматически загружать файл класса по его пространству имен без необходимости использования пользовательского автозагрузчик, но это не работает).

Чего я хочу добиться, так это написать автозагрузчик, который я могу просто удалить, как только функции пространства имен php будут работать правильно (кажется, что при использовании нестандартного автозагрузчика есть преимущество в скорости) с необходимостью изменить как можно меньше кода возможно впоследствии.

Итак, у меня есть такой звонок:

$filereader = new system\libraries\file\XML();

, который передается корректно как строка "system \ library \ file \ XML" моей функции автозагрузки. Я могу загрузить соответствующий файл "system / library / file / XML.class.php". Тем не менее, класс там будет назван

class XML { ... }

(или что-то отличное от «system \ library \ file \ XML») и поэтому имеет другое имя, чем то, по которому PHP будет пытаться его загрузить. Так есть ли простой способ загрузить этот класс («XML»), имя которого отличается от имени, которое я передаю функции автозагрузчика? Могу ли я что-то сделать в автозагрузчике, чтобы добиться такого поведения? (Я использую spl_autoload_register).

Я знаю, что даже если бы это сработало, я все равно не смог бы использовать все возможности пространства имен, так как (простой) автозагрузчик не соблюдал бы директиву «use namespace», и мне все равно приходилось бы использовать довольно длинные имена для загрузка класса. Однако, если я правильно понял функции пространства имен PHP, я мог бы оставить код таким, какой он есть, когда позже переключусь на использование поддержки собственного пространства имен вместо моего автозагрузчика.

Если то, что я пытаюсь сделать, вообще не имеет смысла, по вашему мнению, или если я неправильно понял пространства имен, пожалуйста, скажите мне (- я еще не использовал функции пространства имен PHP).

1 Ответ

3 голосов
/ 28 мая 2011

Я бы загрузил файл (который создает класс XML), а затем присвоил псевдоним классу XML правильному пространству имен system\libraries\file\XML класс:

class_alias('XML', 'system\libraries\file\XML');

В более общем смысле:

class_alias(basename($class), $class));

Хотя я не совсем уверен, может ли class_alias использовать псевдоним для классов пространства имен ...

...