is_callable

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

is_callable 验证一个值是否可以从当前作用域调用为函数。

描述

is_callable(混合类型 $value, 布尔型 $syntax_only = false, 字符串 &$callable_name = null): 布尔型

验证一个值是否是 可调用.

参数

value

要检查的值

syntax_only

如果设置为 true,函数只验证 value 是否可能是一个函数或方法。它只会拒绝不是字符串的简单变量,或者结构不符合回调函数要求的数组。有效的数组应该只有 2 个元素,第一个元素是对象或字符串,第二个元素是字符串。

callable_name

接收 "可调用名称"。在下面的示例中,它是 "someClass::someMethod"。但是请注意,尽管这意味着 someClass::SomeMethod() 是一个可调用的静态方法,但事实并非如此。

返回值

如果 value 是可调用的,则返回 true,否则返回 false

示例

示例 #1 is_callable() 示例

<?php
// 如何检查一个变量是否可以作为函数调用。

示例 #2 is_callable() 和构造函数

is_callable() 报告构造函数不可调用。

<?php

class Foo
{
public function
__construct() {}
public function
foo() {}
}

var_dump(
is_callable(array('Foo', '__construct')),
is_callable(array('Foo', 'foo'))
);

上面的示例将输出

bool(false)
bool(false)

注释

  • 如果一个对象实现了 __invoke(),并且该方法在当前作用域中可见,那么该对象总是可调用的。
  • 如果一个类名实现了 __callStatic(),那么该类名是可调用的。
  • 如果一个对象实现了 __call(),那么这个函数将对该对象上的任何方法返回 true,即使该方法没有定义。
  • 如果使用类名调用此函数,它可能会触发自动加载。

参见

添加注释

用户贡献的注释 2 个注释

izharaazmi at gmail dot com
8 年前
如果目标类实现了 __call() 魔术函数,那么 is_callable 总是对调用它的任何方法返回 TRUE。
is_callable 不会评估 __call() 实现中的内部逻辑(这样做是合理的)。
因此,对于此类类,每个方法名都是可调用的。

因此,说(正如有人所说)是错误的
...is_callable 将正确确定使用 __call 创建的方法的存在...

示例
<?php
class TestCallable
{
public function
testing()
{
return
"I am called.";
}

public function
__call($name, $args)
{
if(
$name == 'testingOther')
{
return
call_user_func_array(array($this, 'testing'), $args);
}
}
}

$t = new TestCallable();
echo
$t->testing(); // 输出:I am called.
echo $t->testingOther(); // 输出:I am called.
echo $t->working(); // 输出: (null)

echo is_callable(array($t, 'testing')); // 输出:TRUE
echo is_callable(array($t, 'testingOther')); // 输出:TRUE
echo is_callable(array($t, 'working')); // 输出:TRUE,预期:FALSE
?>
mohamed dot elidrissi at protonmail dot com
3 年前
请注意,从 PHP 8.0 开始,如果您使用类名,is_callable() 将不能与非静态方法一起使用,而应该提供类的对象

<?php

class Test
{
public function
method1() { }
public static function
method2() { }
}

// PHP 8 之前
var_dump(is_callable(array('Test', 'method1'))); // bool(true)
var_dump(is_callable(array('Test', 'method2'))); // bool(true)

// PHP 8 之后
var_dump(is_callable(array('Test', 'method1'))); // bool(false)
var_dump(is_callable(array('Test', 'method2'))); // bool(true)
var_dump(is_callable(array(new Test, 'method1'))); // bool(true)

?>
To Top