Получить PHP вызываемые аргументы в виде массива?

Скажем, у меня есть вызываемый объект, хранящийся как переменная

$callable = function($foo = 'bar', $baz = ...) { return...; }

Как бы я получить «бар»?

if (is_callable($callable)) {
return func_get_args();
}

к несчастью func_get_args() для текущей функции, возможно ли получить пару значений ключ-аргумент?

2

Решение

Ты можешь использовать отражение:

$f = new ReflectionFunction($callable);
$params = $f->getParameters();
echo $params[0]->getDefaultValue();
3

Другие решения

Вы можете использовать get_defined_vars Для этого эта функция будет возвращать массив всех определенных переменных, в частности, путем доступа к callable индекс из выходного массива.

1

Я столкнулся с этим вопросом, потому что искал аргументы для вызываемого объекта, а не только самой функции. Мой случай

class MyClass{
public function f(){
// do some stuff
}
}

$myclass = new MyClass();
$callable = array($myclass, "f);

Это действительный обратный вызов в php. В этом случае решение, данное @Marek, не работает.

Я работал с phps is_callable функция. Вы можете получить имя функции, используя третий параметр. Затем вы должны проверить, является ли ваш обратный вызов функцией или методом (класса / объекта). В противном случае Reflection-классы испортят.

if($callable instanceof Closure){
$name = "";
is_callable($callable, false, $name);

if(strpos($name, "::") !== false){
$r = new ReflectionMethod($name);
}
else{
$r = new ReflectionFunction($name);
}
}
else{
$r = new ReflectionFunction($callable);
}

$parameters = $r->getParameters();
// ...

Это также возвращает правильное значение для ReflectionFunctionAbstract::isStatic() хотя $name всегда использует :: который обычно указывает на статическую функцию (за некоторыми исключениями).


Примечание: в PHP> = 7.0 это может быть проще при использовании Closures. Там вы можете сделать что-то вроде

$closure = Closure::fromCallable($callable);

$r = new ReflectionFunction($closure);

Вы также можете вызвать необходимость различать ReflectionFunction а также ReflectionMethod но я не могу проверить это, потому что я не использую PHP> = 7.0.

1
По вопросам рекламы [email protected]