Intereting Posts
Форма Codeigniter с выпадающим списком с добавлением категории name в категорию в таблице блога и таблице категорий с именем catgoryname OpenCart2 vqmod заменить, до и после замены? Выражение PHP <<< EOB Извлечение десятичного или целочисленного из строки в php Как документировать REST API на основе Symfony (аналогично возможностям документации enunciate) Примечание: Неизвестно: Пропуск цифровой клавиши 1 в Unknown в строке 0 Изменение диалогового окна подтверждения javascript для загрузки php запускается один раз и дважды вставляет в базу данных mysql PHP и regexp принимают только греческие символы в форме Подписки PayPal PDT / IPN – ПОЖАЛУЙСТА Пароль не проверяется с помощью функции password_verify как показать контент точно так же, как он сохранен в mysql MySQL SELECT женщины не мужчины Как безопасно использовать UniqueEntity (на сайтах с более чем одним одновременным пользователем) Как передать выражение XPath как параметр XSL с помощью PHP?

Выведение параметров закрытия PHP

Есть ли вероятность, что я могу вывести информацию о параметрах типа PHP Closure? Рассмотрим этот пример:

<?php $foo = function(array $args) { echo $args['a'] . ' ' . $args['b']; }; $bar = function($a, $b) { echo $a . ' ' . $b; }; $closure = /* some condition */ $foo : $bar; if(/* $closure accepts array? */) { call_user_func($closure, ['a' => 5, 'b' => 10]); } else { call_user_func($closure, 5, 10); } ?> 

Я хочу оставить некоторую свободу для пользователя, чтобы он или она могли решить, какой способ лучше определить закрытие, которое будет зарегистрировано в моем диспетчере, – будет ли он принимать параметры в ассоциативном массиве или непосредственно как параметры Closure. Таким образом, диспетчеру необходимо вывести параметры пройденного Закрытия, чтобы определить, каким образом он должен называть это закрытие. Есть идеи?

Используйте reflection , если вам нужно принимать решения, основываясь на структуре кода. В вашем случае ReflectionFunction и ReflectionParameter являются вашими друзьями.

 <?php header('Content-Type: text/plain; charset=utf-8'); $func = function($a, $b){ echo implode(' ', func_get_args()); }; $closure = &$func; $reflection = new ReflectionFunction($closure); $arguments = $reflection->getParameters(); if($arguments && $arguments[0]->isArray()){ echo 'Giving array. Result: '; call_user_func($closure, ['a' => 5, 'b' => 10]); } else { echo 'Giving individuals. Result: '; call_user_func($closure, 5, 10); } ?> 

Вывод:

 Giving individuals. Result: 5 10 

Изменить определение для проверки:

 $func = function(array $a){ echo implode(' ', $a); }; 

Вывод:

 Giving array. Result: 5 10 

Было бы намного проще, если бы ваша функция могла принимать разные типы ввода.

Например, в этом случае:

 $foo = function() { $args = func_get_args(); if( is_array($args[0])) $args = $args[0]; echo $args[0]." ".$args[1]; }