Intereting Posts
Простое имя учетной записи SPA, сохраненное как «root» вместо заданного имени пользователя Сортировка нескольких таблиц MYSQL DateStamp Запустите sql-запрос с таймаутом в PHP или Как в PHP, чтобы остановить запрос sql, как только он уже начался? Как скопировать электронную почту с Gmail на мой сервер с помощью PHP IMAP? Метод контроллера не найден – laravel 4 set-post-thumbnail wp-ajax return 0 API Facebook без аутентификации клиента для общего контента Как сохранить переменную Javascript как файл на клиентском ПК Динамические перезаписи в файле htaccess Кто-нибудь сталкивался с этой ошибкой php раньше, Warning: imagejpeg ()? Кнопка удаления PHP / SQL для каждой строки Функция isset работает неправильно Как я могу переставить элементы массива, перемещая зависимости сверху? Самый простой способ построить дерево из списка предков Добавьте строку в таблицу и отправьте на сервер, отправьте стол через jquery на php

Как вызвать анонимную функцию PHP с различным порядком аргументов

Я хочу вызвать анонимную функцию (лямбда или закрытие), которая имеет некоторые аргументы, я знаю имена аргументов, но я не знаю их порядок! Функция call_user_func_array () может вызывать функцию с массивом аргументов, но массив не может быть ассоциативным массивом для установки каждого значения для желаемого аргумента, следующие коды – мои попытки решить мою проблему, но они просто не работают!

Функция:

$function = function ($b, $c, $a) { echo "a=" . $a . " & b=" . $b . " & c=" . $c; }; 

Мой желаемый результат:

 a=1 & b=2 & c=3 

Мои попытки:

 // Attempt 1 call_user_func_array($function, array("a" => 1, "b" => 2, "c" => 3)); // Attempt 2 $ref = new ReflectionFunction($function); $ref->invokeArgs(array("a" => 1, "b" => 2, "c" => 3)); 

Выходная мощность:

 a=3 & b=1 & c=2 

Вы должны передавать параметры позиционно, имена не учитываются вообще. Вы можете отобразить параметры по имени в их положение с помощью отражения:

 $params = array("a" => 1, "b" => 2, "c" => 3); $ref = new ReflectionFunction($function); $arguments = array_map( function (ReflectionParameter $param) use ($params) { if (isset($params[$param->getName()])) { return $params[$param->getName()]; } if ($param->isOptional()) { return $param->getDefaultValue(); } throw new InvalidArgumentException('Missing parameter ' . $param->getName()); }, $ref->getParameters() ); $ref->invokeArgs($arguments);