ТАК,
У меня проблема с созданием динамических объектов с использованием пространств имен. Вот код пространства имен:
namespace Foo { class Bar { } }
Теперь я пытаюсь создать объект класса Bar
с:
include('namespace.php'); $sName = 'Bar'; $sClass = '\\Foo\\'.$sName; $rObj = new $sClass; //correct object
вinclude('namespace.php'); $sName = 'Bar'; $sClass = '\\Foo\\'.$sName; $rObj = new $sClass; //correct object
и все хорошо. Но теперь я хочу использовать псевдоним и делать что-то вроде:
include('namespace.php'); use Foo as Baz; $sName = 'Bar'; $sClass0= '\\Foo\\'.$sName; $sClass1= '\\Baz\\'.$sName; $rObj = new $sClass0; //correct object $rObj = new $sClass1; //Fatal error
вinclude('namespace.php'); use Foo as Baz; $sName = 'Bar'; $sClass0= '\\Foo\\'.$sName; $sClass1= '\\Baz\\'.$sName; $rObj = new $sClass0; //correct object $rObj = new $sClass1; //Fatal error
И я не могу создать экземпляр объекта таким образом (и доступ через полное имя все еще хорошо работает). Итак, мой вопрос: возможно ли получить доступ к классу через псевдоним, и, если да, то как? Я также пытался получить доступ при использовании $sClass1='Baz\\'.$sName
– нет успеха. Кроме того, я проверил объявленные классы с помощью функции get_declared_classes()
, он показывает, что у меня есть только класс \Foo\Bar
(ссылка на псевдоним не указана).
Я не уверен, если это имеет значение, но я использую версию PHP 5.5.
Только парсер использует ваши псевдонимы пространства имен для канонизации ссылок на классы внутри каждого из ваших файлов.
Другими словами, он не вводит какой-либо глобальный псевдоним, который может использовать другой код. После того как ваш скрипт был проанализирован, псевдоним больше не используется.
Это поведение также описано в руководстве :
Импорт выполняется во время компиляции и поэтому не влияет на имена динамических классов, функций или констант.