За последние 24 часа нас посетили 63013 программистов и 1744 робота. Сейчас ищут 887 программистов ...

почему динамически не создается объект в Laravel

Тема в разделе "PHP для новичков", создана пользователем yurri_87, 14 ноя 2017.

Метки:
  1. yurri_87

    yurri_87 Новичок

    С нами с:
    29 авг 2017
    Сообщения:
    37
    Симпатии:
    5
    Всем привет!
    PHP:
    1. namespace App\Http\Controllers;
    2. use App\Http\Controllers\SocialNetworks\VkontakteController;
    3. use Illuminate\Http\Request;
    4. use App\Http\Requests;
    5.  
    6. class SocialManagerFactory extends Controller
    7. {
    8.     static function getController($network){
    9.         $class = "\\App\\Http\\Controllers\\SocialNetworks\\VkontakteController";
    10.         $controller = new $class;
    11.     }
    12. }
    код выше работает. Но только при указании абсолютного неймспейса.
    Меня интересует - почему не работает
    PHP:
    1. $class = "VkontakteController";
    2. $controller = new $class;
    Выдает ошибку: Class 'VkontakteController' not found


    но работает вариант
    Код (Text):
    1. $controller = new VkontakteController;
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Например, можно определить псевдоним пространства имен... (use App\Http\Controllers\SocialNetworks\VkontakteController as VkontakteController), или в конструкции use не указывать определенный класс, а ограничиться его пространством имен и подставить это пространство имен оператору new... а-ля new subnamespace\foo()...
     
  3. yurri_87

    yurri_87 Новичок

    С нами с:
    29 авг 2017
    Сообщения:
    37
    Симпатии:
    5
    как сделать чтобы работало - это не проблема.
    мне интересно разобраться - почему же работает 3й блок кода, но не работает 2й?
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Действительно, вопрос совсем не о том...
    Однако, потому, что так написано в документации (применительно к динамически формируемым именам):
     
  5. gruth

    gruth Активный пользователь

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    3 блок работает потому что в пхп это фишка неймспейсов, она добавляет при объявлении класса неймспейс. В 2 блоке неймспейс не добавляется т.к. это уже строковое значение, и, видимо, не добавляет автоматом нужное
     
    yurri_87 нравится это.
  6. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    А с круглыми скобочками пробовали?
    PHP:
    1. $controller = new $class();
     
  7. yurri_87

    yurri_87 Новичок

    С нами с:
    29 авг 2017
    Сообщения:
    37
    Симпатии:
    5
    да, пробовал, то же самое
     
  8. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @yurri_87, тогда можно поподробнее где не находит класс?
     
  9. yurri_87

    yurri_87 Новичок

    С нами с:
    29 авг 2017
    Сообщения:
    37
    Симпатии:
    5
    обдумываю тему. Думаю над
    возможно это так, но просто сомнения какие-то, мне бы ссылокчку на эту фишку
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    При динамическом задании имени класса через переменную необходимо указывать полное имя класса, со всеми namespace. Создание объекта в этом случае происходит в недрах php, там всех ваших use не прописано, они действуют в пределах одного файла. В документации php это есть.
    --- Добавлено ---
    Как вариант
    PHP:
    1. $class = VkontakteController::class;
    2. $controller = new $class;
     
    yurri_87 нравится это.
  11. yurri_87

    yurri_87 Новичок

    С нами с:
    29 авг 2017
    Сообщения:
    37
    Симпатии:
    5
    Нет, это вряд ли подойдет, у меня ж фабрика, по сути я иду к тому, чтобы по одной переменной $network создать нужный объект. Получается все возможные классы, которые могут быть задействованы - должны находиться в одном неймспейсе?

    PHP:
    1. $name = 'name';
    2. $obj = new $name;
    работает потому что все это происходит в том неймспейсе, в котором находится класс 'name'? или все же потому что php сам подставляет нужный неймспейс при объявлении объекта? Почему затушевался - потому что сверху коммент был что если не динамически - то подставляет, а если динамически - то нет
     
    #11 yurri_87, 14 ноя 2017
    Последнее редактирование: 14 ноя 2017
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Если создаётся динамически, всегда нужно указывать полное имя класса, иначе будет ошибка: https://ideone.com/9qzOas

    В фабриках я часто склеиваю имя, используя константу __NAMESPACE__
     
    gruth и yurri_87 нравится это.