检查call_user_func_array是否执行成功
Check if call_user_func_array was executed succesfully
可以使用 call_user_func_array
动态调用函数或方法。如果调用本身失败,FALSE
被 returned。此外,call_user_func_array
return 是来自被调用的函数或方法的 return 值。
所以当被调用的函数或方法returns FALSE
以及(例如,参见SO example)时,该值将被识别为误报。
如何可靠地检查 call_user_func_array
是否成功执行函数或方法调用?
编辑:人们倾向于指出is_callable
的存在。但这并不是在调用一个方法之前检查它是否存在,从而避免可能的错误。实际上在执行 call_user_func_array
函数调用之前,它的参数和参数类型已经使用 Reflection
进行了验证以避免 Massive Assign attack.
documentation 提到了 FALSE
return 值,但我看不出如何使用它来检查调用是否成功。
您可以明确检查上次调用是否发生错误:
error_clear_last(); // since PHP 7, before that you'll need to store and
// compare the error state before and after the call
$result = call_user_func_array($foo, $bar);
if ($result === false && error_get_last()) {
echo 'Failed to call ', $foo;
}
以上是对 any 错误的一般检查,也许您想更详细地检查最后一个错误。它看起来像:
Array
(
[type] => 2
[message] => call_user_func_array() expects parameter 1 to be a valid callback, function 'foo' not found or invalid function name
[file] => /in/M8PrG
[line] => 3
)
您可能需要检查 message
是否匹配 'call_user_func_array() expects parameter 1 to be a valid callback'
and/or 之类的内容,它所指的行就是上面的行。请注意,特别检查消息可能会在 PHP 个版本之间中断。
另一种方法是在之前检查你的回调是否is_callable
.
我会将布尔可调用对象转换为无效但会在出错时抛出异常的对象。
这样,您可以捕获异常,并且您会知道 false
是否由 call_user_func_array
返回,只有它的调用失败:
<?php
$booleanCallable = function (... $args): bool {
foreach ($args as $arg) {
echo "$arg \n";
};
return false;
};
$transformBooleanCallableToVoidThrowingException = function (callable $c): callable {
return function (... $args) use ($c): void {
if (false === $c(... $args)) {
throw new \RuntimeException("the call to the callable failed");
}
};
};
try {
$callable = $transformBooleanCallableToVoidThrowingException($booleanCallable);
$response = call_user_func_array($callable, [1, 2, 3]);
if (false === $response) {
throw new \RuntimeException("call_user_func_array failed");
}
} catch (\Exception $e) {
echo $e->getMessage();
}
这将输出提供的参数和一条错误消息:
1
2
3
the call to the callable failed
可以使用 call_user_func_array
动态调用函数或方法。如果调用本身失败,FALSE
被 returned。此外,call_user_func_array
return 是来自被调用的函数或方法的 return 值。
所以当被调用的函数或方法returns FALSE
以及(例如,参见SO example)时,该值将被识别为误报。
如何可靠地检查 call_user_func_array
是否成功执行函数或方法调用?
编辑:人们倾向于指出is_callable
的存在。但这并不是在调用一个方法之前检查它是否存在,从而避免可能的错误。实际上在执行 call_user_func_array
函数调用之前,它的参数和参数类型已经使用 Reflection
进行了验证以避免 Massive Assign attack.
documentation 提到了 FALSE
return 值,但我看不出如何使用它来检查调用是否成功。
您可以明确检查上次调用是否发生错误:
error_clear_last(); // since PHP 7, before that you'll need to store and
// compare the error state before and after the call
$result = call_user_func_array($foo, $bar);
if ($result === false && error_get_last()) {
echo 'Failed to call ', $foo;
}
以上是对 any 错误的一般检查,也许您想更详细地检查最后一个错误。它看起来像:
Array
(
[type] => 2
[message] => call_user_func_array() expects parameter 1 to be a valid callback, function 'foo' not found or invalid function name
[file] => /in/M8PrG
[line] => 3
)
您可能需要检查 message
是否匹配 'call_user_func_array() expects parameter 1 to be a valid callback'
and/or 之类的内容,它所指的行就是上面的行。请注意,特别检查消息可能会在 PHP 个版本之间中断。
另一种方法是在之前检查你的回调是否is_callable
.
我会将布尔可调用对象转换为无效但会在出错时抛出异常的对象。
这样,您可以捕获异常,并且您会知道 false
是否由 call_user_func_array
返回,只有它的调用失败:
<?php
$booleanCallable = function (... $args): bool {
foreach ($args as $arg) {
echo "$arg \n";
};
return false;
};
$transformBooleanCallableToVoidThrowingException = function (callable $c): callable {
return function (... $args) use ($c): void {
if (false === $c(... $args)) {
throw new \RuntimeException("the call to the callable failed");
}
};
};
try {
$callable = $transformBooleanCallableToVoidThrowingException($booleanCallable);
$response = call_user_func_array($callable, [1, 2, 3]);
if (false === $response) {
throw new \RuntimeException("call_user_func_array failed");
}
} catch (\Exception $e) {
echo $e->getMessage();
}
这将输出提供的参数和一条错误消息:
1
2
3
the call to the callable failed