За последние 24 часа нас посетили 22494 программиста и 997 роботов. Сейчас ищут 645 программистов ...

Почему не работает splat?

Тема в разделе "Прочие вопросы по PHP", создана пользователем Вероломство, 24 мар 2021.

  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    PHP:
    1. call_user_func($callback, $this->request, ...$this->request->getBody() /* ['a' => string '1'] */);
    Cannot unpack array with string keys

    Что ещё за новости.

    p.s. PHP-7.4.5
     
    #1 Вероломство, 24 мар 2021
    Последнее редактирование: 24 мар 2021
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.747
    Симпатии:
    1.321
    Адрес:
    Лень
    возвращаемый массив имеет строковые ключи.
     
  3. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    ну и что, мне так и надо, я хочу в экшенах обращаться к ключам массива по именам переменных, в данном случае у меня в экшене перменная $a должна быть равна 1, так как я распаковываю массив ['a' => string '1']

    а так-то перевод сообщения я знаю...
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.747
    Симпатии:
    1.321
    Адрес:
    Лень
    ты распаковывешь массив на аргументы, какие ключи ? какое обращение по ключам ?
     
  5. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    вот такое (так у меня сделано в другом движке)

    PHP:
    1. public static function dispatch($url)
    2.     {
    3.         if (!self::matchRoute($url)) {
    4.             throw new Error('Страница не найдена');
    5.         }
    6.  
    7.         $controller = self::$namespace . self::$route['controller'] . 'Controller';
    8.  
    9.         if (!class_exists($controller)) {
    10.             throw new Error("Контроллер {$controller} не найден", 404);
    11.         }
    12.  
    13.         $cObj = new $controller(self::$route);
    14.  
    15.         $action = self::$route['action'] . 'Action';
    16.  
    17.         if (!method_exists($cObj, $action)) {
    18.             throw new Error("Метод {$controller}::{$action} не найден", 404);
    19.         }
    20.  
    21.         $cObj->$action(...self::$params /* ['a' => 1] */);
    22.         $cObj->getView();
    23.     }
    24.  
    25. // применение в экшене
    26.  
    27. public function test($a)
    28. {
    29.     var_dump($a); // 1
    30. }
    31.  
    32. public function test($b)
    33. {
    34.     var_dump($b); // Unknown named parameter $a
    35. }
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.747
    Симпатии:
    1.321
    Адрес:
    Лень
    Вероломство нравится это.
  7. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.747
    Симпатии:
    1.321
    Адрес:
    Лень
    избавься от строковых ключей
     
  9. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    зачем? мне переменные нужны такие, как ключи ))) я не хочу тупо любой переменной обращаться к ключам-значениям, мне нужно чтобы переменной $a присваивалось значение ключа массива - 'a', ты же сам так сделал и так у меня сделано в другом движке

    а то что ты предлагаешь, то оно будет выглядеть вот так

    http://sandbox.onlinephpfunctions.com/code/ab7c854d6de7fd66aa46302590f321b8579f7b41

    а это - дичь
    --- Добавлено ---
    @MouseZver вот так работает

    PHP:
    1. // call_user_func($callback, $this->request, ...$this->request->getBody());
    2. call_user_func_array($callback, $this->request->getBody());
    но мне ведь просто $this->request ещё нужно передать
     
  10. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    @MouseZver короче - это фишка 8-й версии, решено