Скажем, у меня есть вызываемый объект, хранящийся как переменная
$callable = function($foo = 'bar', $baz = ...) { return...; }
Как бы я получить «бар»?
if (is_callable($callable)) {
return func_get_args();
}
к несчастью func_get_args()
для текущей функции, возможно ли получить пару значений ключ-аргумент?
Ты можешь использовать отражение:
$f = new ReflectionFunction($callable);
$params = $f->getParameters();
echo $params[0]->getDefaultValue();
Вы можете использовать get_defined_vars Для этого эта функция будет возвращать массив всех определенных переменных, в частности, путем доступа к callable
индекс из выходного массива.
Я столкнулся с этим вопросом, потому что искал аргументы для вызываемого объекта, а не только самой функции. Мой случай
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.