За последние 24 часа нас посетили 22338 программистов и 1139 роботов. Сейчас ищут 612 программистов ...

Можно ли сделать extract() В параметры?

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

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

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    PHP:
    1. class A
    2. {
    3.     function a($a)
    4.     {
    5.         var_dump($b /* или $c или $d и так далее */); // test
    6.     }
    7. }
    8.  
    9. (new A()->a(...array_values(['a' => 'test'])));

    Теперь код для вопроса, он примерный, просто отображает то, чего хочется добиться, так что не ржать сильно :)

    PHP:
    1. class A
    2. {
    3.     function a($a)
    4.     {
    5.         var_dump($a /* строго по имени параметра */); // test
    6.     }
    7. }
    8.  
    9. (new A()->a(extract(['a' => 'test'])));
    Можно ли реализовать такой extract(), чтобы обращаться к ключам массива строго по имени параметра? :rolleyes:
     
  2. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Другими словами вы хотите получить ключ массива в переменную?
     
    Вероломство нравится это.
  3. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    в параметр по имени ключа, вот как распакован массив, так и юзать распакованные переменные, но распаковку делать не в методе, а чтобы в параметрах уже были распакованные
     
  4. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
  5. Вероломство

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

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

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Так запишите в строку ключи.
     
    Вероломство нравится это.
  7. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    короче у меня роутер создаёт объект и вызывает метод, в метод передаются параметры, я хочу в методах контроллеров просто использовать переменные, ДАЖЕ НАВЕРНОЕ не из параметров, а чтобы они роутером были распакованы и я имел доступ к ним в методах контроллеров по именам параметров
    --- Добавлено ---
    @Drunkenmunky короче вот так может будет понятно

    PHP:
    1. // в роутере делаем
    2. extract(['a' => 'test']);
    3. $cObj->$action();// вызвали метод test из роутера
    4.  
    5. // $cObj->test();
    6. function test()
    7. {
    8.     // дебажим распакованную переменную
    9.     var_dump($a); // ДОЛЖНО БЫТЬ - test
    10. }
    вот как я хотел бы
     
  8. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
  9. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    так у меня вызван метод переменной, мне массив, распакованный перед вызовом метода, нужно видеть ВНУТРИ ВЫЗВАННОГО МЕТОДА, в виде переменных, которые получены этой распаковкой :)
     
  10. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Сдаюсь.
     
    Вероломство нравится это.
  11. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    я сделал :)

    PHP:
    1. call_user_func_array([$cObj, $action /* test() */], ['a' => 555]);
    2.  
    3. function test($a)
    4. {
    5.     var_dump($a); // 555
    6. }
    7.  
    8. function test($b)
    9. {
    10.     var_dump($b); // Unknown named parameter $a
    11. }
    то есть мы обратились к ключу массива именно по имени параметра :)
     
  12. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Красавец, чо.
     
    Вероломство нравится это.
  13. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    @Drunkenmunky спасибо, что давал как бы неверное направление, это позволило отбросить лишнее :)
     
  14. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Вероломство нравится это.
  15. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    ага, я их и пилил :)
     
  16. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    @Drunkenmunky а вообще я затупил

    (new A()->a(...array_values(['a'=>'test'])));

    меняем на

    (new A()->a(...['a'=>'test']));

    и будет то же что

    call_user_func_array([new A(), 'a'],['a'=>'test']);

    я ключи убрал же из массива (array_values) и втыкаю, как к ним обратиться