За последние 24 часа нас посетили 22799 программистов и 1246 роботов. Сейчас ищет 741 программист ...

Получение имен аргументов переменной длины (... $args)

Тема в разделе "PHP для профи", создана пользователем KING_PHP, 26 апр 2019.

  1. KING_PHP

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

    С нами с:
    18 апр 2015
    Сообщения:
    154
    Симпатии:
    3
    Адрес:
    Волгоград
    Доброго времени суток. Затронул меня за одно место вот такой вот вопрос:

    Можно ли получить имена аргументов переменной длины (... $args, знаю, что можно), это необходимо для создания своеобразной функции-заполнителя переменных. Проще показать, чем объяснить, на данный момент это работает как-то так:

    PHP:
    1. public function genVars($selectors, &...$args)
    2. {
    3.  
    4. $init = [
    5. 'id' => isset($data->object->peer_id) ? $data->object->peer_id : null,
    6. 'user_id' => isset($data->object->from_id) ? $data->object->from_id : null,
    7. 'message' => isset($data->object->text) ? $data->object->text : null,
    8. 'payload' => isset($data->object->payload) ? $data->object->payload : null,
    9. 'type' => isset($this->data->type) ? $this->data->type : null,
    10. 'all' => $data,
    11. ];
    12. $selectors = explode(',', $selectors);
    13. if (count($selectors) != count($args))
    14. throw new VkApiException('Разное количество аргументов и переменных при инициализации');
    15. foreach ($selectors as $key => $val)
    16. $args[$key] = $init[trim($val)];
    17. }
    Ну и вызов:

    PHP:
    1. $coin->genVars('from_id,amount,verify,payload,data', $from_id, $amount, $verify, $payload, $data);
    Необходимо исключить из данного вызова часть с передачей имен, т.е:

    PHP:
    1. $coin->genVars($from_id, $amount, $verify, $payload, $data);
    Задача: найти более-менее оптимизированный костыль.
     
    #1 KING_PHP, 26 апр 2019
    Последнее редактирование: 26 апр 2019
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    PHP:
    1. [ 'host' => $host, 'user' => $user, 'password' => $pass, 'dbname' => $dbname, 'port' => $port, 'charset' => $charset ] = $args;
    --- Добавлено ---
    PHP:
    1. public function __construct ( Lerma $lerma, array $params )
    2.     {
    3.         $this -> lerma = $lerma;
    4.        
    5.         [ 'host' => $host, 'user' => $user, 'password' => $pass, 'dbname' => $dbname, 'port' => $port, 'charset' => $charset ] = $params;
    6.        
    7.         $this -> connect = new \mysqli( $host, $user, $pass, $dbname, $port );
    8.        
    9.         if ( $this -> connect -> connect_error )
    10.         {
    11.             throw new Error( "Error connect ({$this -> connect -> connect_errno}) {$this -> connect -> connect_error}" );
    12.         }
    13.        
    14.         $this -> connect -> set_charset( $charset );
    15.     }
     
  3. KING_PHP

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

    С нами с:
    18 апр 2015
    Сообщения:
    154
    Симпатии:
    3
    Адрес:
    Волгоград
    Конечно спасибо, но это не то.
    --- Добавлено ---
    Решение было найдено за 2 минуты после публикации, самым сложным оказалось убедить автора библиотеки (да, это код из библиотеки, которая валяется на гитхабе), в том что так делать не нада, и проще сделать так:
    PHP:
    1.     public function initVars(&$from_id, &$amount, &$payload, &$verify, &$data)
    2.     {
    3.         print 'OK';
    4.         $data_request = json_decode(file_get_contents('php://input'));
    5.         $data = $this->data_request = $data_request;
    6.         $id = isset($data_request->id) ? $data->id : null;
    7.         $from_id = isset($data_request->from_id) ? $data_request->from_id : null;
    8.         $payload = isset($data_request->payload) ? $data_request->payload : null;
    9.         $amount = isset($data_request->amount) ? $data_request->amount : null;
    10.         $verify = $this->verifyKeys();
    11.     }