Динамическая загрузка классов не может адресовать пространство имен/использование
Я заметил, что когда я использую namespacing, динамические классы загрузки не работают так же, как при загрузке их статически. Так, например, без использования пространств имен следующие эквиваленты в их действии создания экземпляра класса FooBar
:
$foobar = new FooBar();
и
$classname = "FooBar";
$foobar = new $classname;
Однако, если при использовании пространства имен у меня есть такой код:
<?php
namespace Structure\Library;
$foobar = new UserService();
$classname = "UserService";
$barfoo = new $classname;
В этом случае полное имя класса UserService
равно Structure\Library\UserService
, и если я использую полное имя, оно работает в обоих случаях, но если я использую только имя ярлыка 'UserService'
, оно работает только при создании экземпляра с помощью статический метод. Есть ли способ заставить его работать для обоих?
P.S. Я использую автозагрузчик для всех классов... но я предполагаю, что проблема происходит перед автозагрузчиком и выполняется строка класса, передаваемая автозагрузчику.
Ответы
Ответ 1
Я думаю, что это пример чтения документации. См. Пример 3:
http://php.net/manual/en/language.namespaces.importing.php
Кажется, чтобы подтвердить мой предыдущий комментарий.
<?php
namespace foo\bar;
$classStr = "myClass";
$nsClass = "\\foo\\bar\\myClass";
$x = new myClass; // instantiates foo\bar\myClass, because of declared namespace at top of file
$y = new $classStr; // instantiates \myClass, ignoring declared namespace at top of file
$z = new $nsClass // instantiates foo\bar\myClass, because it an absolute reference!
?>
Ответ 2
Это будет ближайшее решение, которое я могу найти:
define('__NSNAME__', __NAMESPACE__.'\\');
$foobar = new UserService();
$classname = __NSNAME__."UserService";
$barfoo = new $classname;
Удачи!
Обновление 1
Это может быть полезно для дальнейшего чтения: http://www.php.net/manual/en/language.namespaces.importing.php
use My\Full\UserService as UserService;
Обновление 2
Вот как я сейчас оказался:
namespace Structure\Library\Home;
class UserService {
}
namespace Structure\Library;
use Structure\Library\Home\UserService as UserService;
define('UserService', __NAMESPACE__.'\\Home\\UserService', TRUE);
$foobar = new UserService();
$classname = UserService;
$barfoo = new $classname;
Или этот вариант для большей гибкости:
define('Home', __NAMESPACE__.'\\Home\\', TRUE);
$foobar = new UserService();
$classname = Home.'UserService';
$barfoo = new $classname;
Docs