Зачем использовать класс alisases?

Почему мы должны использовать функцию class_alias ? Например:

 Class Test { public function __construct(){ echo "Class initialized"; } } class_alias("Test", "AnotherName"); $instance = new AnotherName(); # equivalent to $instance = new Test(); 

Согласно руководству , «Класс с псевдонимом точно такой же, как и у первоначального класса».

Для чего это полезно?

Related of "Зачем использовать класс alisases?"

Удивительно, но никто не упомянул очевидную причину, по которой это можно было бы сделать: ключевое слово use может use только в самой внешней области и обрабатывается во время компиляции, поэтому вы не можете use Some\Class на основе некоторого условия, а также не можете он должен быть блочным:

 namespace Foo; if (!extension_loaded('gd')) { use Images\MagicImage as Image; } else { use Images\GdImage as Image; } class ImageRenderer { public function __construct(Image $img) {} } 

Это не сработает: хотя операторы use находятся в самой верхней области, эти импорт, как я уже говорил, выполнялся во время компиляции, а не во время выполнения. В результате этот код ведет себя так, как если бы он был написан так:

 namespace Foo; use Images\GdImage as Image; use Images\MagicImage as Image; 

Который приведет к ошибке (2 класса с тем же псевдонимом …)
class_alias однако, является функцией, которая вызывается во время выполнения, поэтому она может быть заблокирована блоком и может использоваться для условного импорта:

 namespace Foo; if (!extension_loaded('gd')) { class_alias('Images\\MagicImage', 'Image'); } else { class_alias('Images\\GdImage','Image'); } class ImageRenderer { public function __construct(Image $img) {} } 

Помимо этого, я подозреваю, что основным преимуществом class_alias является то, что весь написанный код до PHP 5.3 (который вводил пространства имен) позволял вам не писать такие вещи, как:

 $foo = new My_Lib_With_Pseudo_Name_Spaces_Class(); 

Вместо того, чтобы реорганизовывать всю базу кода и создавать пространства имен, намного проще добавить пару:

 class_alias('My_Lib_With_Pseudo_Name_Spaces_Class', 'MyClass'); 

К началу скрипта, а также к некоторому //TODO: switch to Namespaces комментариям //TODO: switch to Namespaces .

Другой вариант использования может состоять в том, чтобы фактически передать эти классы их class_alias с class_alias : просто измените вызовы class_alias после рефакторинга класса, остальные классы могут остаться нетронутыми.
При рефакторинге кода, скорее всего, вы захотите переосмыслить пару вещей, поэтому предложенный вариант использования, например, предложенный aichingm, может оказаться слишком завышенным.

Последнее, что я могу придумать, но я еще не видел этого, это когда вы хотите протестировать некоторый код с class_alias объектом, вы можете использовать class_alias чтобы все class_alias плавно. Однако, если вам нужно это сделать, вы можете также считать тест неудачным, потому что это свидетельствует о плохо написанном коде, ИМО.

Кстати, только сегодня я столкнулся с другим прецедентом для class_alias . Я работал над тем, чтобы реализовать lib, перегоняемый из инструмента CLI для использования в веб-приложении на основе MVC. Некоторые из классов зависели от экземпляра вызываемой команды, которая должна быть передана, из которой они получили некоторые другие бит и болты.
Вместо того, чтобы решить проблему рефакторинга, я решил заменить:

 use Application\Commands\SomeCommand as Invoker; 

Заявления с:

 if (\PHP_SAPI === 'cli') { class_alias('\\Application\\Commands\\SomeCommand', 'Invoker'); } else { class_alias('\\Web\\Models\\Services\\SomeService', 'Invoker'); } 

и, после быстрого :%s/SomeCommand/Invoker/g в vim, я был :%s/SomeCommand/Invoker/g пойти (более или менее)

Подумайте об этом по-другому. Существует библиотека и содержит класс под названием MySq, так как библиотека движется в процессе разработки, они думают: « О, может быть, нам стоит просто сделать один класс базы данных », поэтому переписать класс и назвать его «DatabaseConnection», он имеет те же функции, что и MySql, но он также может обрабатывать Sql и MsSql. Со временем они выпускают новую версию «PHPLib2». У разработчика теперь есть два варианта: 1, сообщите пользователям об изменении с MySql на DatabaseConnection или 2, разработчик использует

 class_alias("DatabaseConnection","MySql"); 

и просто отмечайте класс MySql как устаревший.

транслятор;

Чтобы сохранить совместимость версий!

Его можно использовать для:

  1. Изменение странных имен классов ext. скрипты / источники (без необходимости переписывать код)
  2. Создание имен классов короче (псевдоним класса можно использовать в широком применении)
  3. Перемещение классов в другое пространство имен (@tlenss)