Подтвердить что ты не робот

Динамическая загрузка классов не может адресовать пространство имен/использование

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

4b9b3361

Ответ 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