如何检查输入是否是可调用的构造或函数


How to check if input is a callable construct or function?

这不是"在PHP中,如何检查函数是否存在?"的重复。

  • http://us3.php.net/function_exists如果输入是一种语言,将失败构造(例如。http://us1.php.net/empty)
  • http://us1.php.net/is_callable使用$syntax_only = true将允许语言构造(例如empty),尽管它也允许random_function_that_does_not_exist

如何检查输入是否是可调用的,无论是作为现有函数还是行为类似函数的语言构造?

您所询问的内容存在各种潜在问题。然而,如果我理解得对,你只是想知道somename是否可以像somename('someinput')一样被调用。

如果这是真的,那么您似乎需要使用function_exists和从关键字列表中手动查找语言结构的组合。

也许是这样的:

function canICall($function) {
    $callableConstructs = array("empty","unset","eval","array","exit","isset","list");
    return function_exists($function) || in_array($function, $callableConstructs);
}

如果$callableConstructs数组不完整,请查看关键字列表页面以构建它

是的,这很难理解,但如果没有PHP内置的方法,我看不到其他选择。

请注意,仅仅因为您可以调用类似于函数的东西,就不会使其成为函数,也不意味着它在其他方面的行为类似于函数

你不能动态地调用它:

$var = "empty";
$var('someinput'); // Does NOT work

这也不起作用:

call_user_func('empty', $foo);

可以eval调用中使用它,但我希望您理解这可能很危险的原因。

由于empty总是存在,并且是一种不能使用变量函数调用的语言结构,因此在其上使用function_exists是毫无意义的。即使function_exists可以工作,也不可能编写以下代码:

$func = 'empty';
if (function_exists($func)) {
    $func($var);
}

调用empty()的唯一方法是在源代码中直接编写它。您不能使用变量函数调用它,就像使用list() =/一样。

你能做的最好的事情是:

if (function_exists('empty')) {
    empty($foo);
}

但因为empty一直存在,测试它有什么意义?

如果你想制定一个验证规则,只需编写自己的函数:

function isEmpty($value) {
    return !$value;
}
$rule = 'isEmpty';

这做了完全相同的事情。

或者您将empty作为规则执行中的特例:

function validate($rule, $value) {
    switch ($rule) {
        case 'empty' :
            return !$value;
        default :
            if (!function_exists($rule)) {
                throw new InvalidArgumentException("$rule does not exist");
            }
            return $rule($value);
    }
}