这不是"在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);
}
}