Всем привет! PHP: namespace App\Http\Controllers; use App\Http\Controllers\SocialNetworks\VkontakteController; use Illuminate\Http\Request; use App\Http\Requests; class SocialManagerFactory extends Controller { static function getController($network){ $class = "\\App\\Http\\Controllers\\SocialNetworks\\VkontakteController"; $controller = new $class; } } код выше работает. Но только при указании абсолютного неймспейса. Меня интересует - почему не работает PHP: $class = "VkontakteController"; $controller = new $class; Выдает ошибку: Class 'VkontakteController' not found но работает вариант Код (Text): $controller = new VkontakteController;
Например, можно определить псевдоним пространства имен... (use App\Http\Controllers\SocialNetworks\VkontakteController as VkontakteController), или в конструкции use не указывать определенный класс, а ограничиться его пространством имен и подставить это пространство имен оператору new... а-ля new subnamespace\foo()...
как сделать чтобы работало - это не проблема. мне интересно разобраться - почему же работает 3й блок кода, но не работает 2й?
Действительно, вопрос совсем не о том... Однако, потому, что так написано в документации (применительно к динамически формируемым именам):
3 блок работает потому что в пхп это фишка неймспейсов, она добавляет при объявлении класса неймспейс. В 2 блоке неймспейс не добавляется т.к. это уже строковое значение, и, видимо, не добавляет автоматом нужное
обдумываю тему. Думаю над возможно это так, но просто сомнения какие-то, мне бы ссылокчку на эту фишку
При динамическом задании имени класса через переменную необходимо указывать полное имя класса, со всеми namespace. Создание объекта в этом случае происходит в недрах php, там всех ваших use не прописано, они действуют в пределах одного файла. В документации php это есть. --- Добавлено --- Как вариант PHP: $class = VkontakteController::class; $controller = new $class;
Нет, это вряд ли подойдет, у меня ж фабрика, по сути я иду к тому, чтобы по одной переменной $network создать нужный объект. Получается все возможные классы, которые могут быть задействованы - должны находиться в одном неймспейсе? PHP: $name = 'name'; $obj = new $name; работает потому что все это происходит в том неймспейсе, в котором находится класс 'name'? или все же потому что php сам подставляет нужный неймспейс при объявлении объекта? Почему затушевался - потому что сверху коммент был что если не динамически - то подставляет, а если динамически - то нет
Если создаётся динамически, всегда нужно указывать полное имя класса, иначе будет ошибка: https://ideone.com/9qzOas В фабриках я часто склеиваю имя, используя константу __NAMESPACE__