PHP Conference Japan 2024

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 是否为 可调用,或者是否可以使用 call_user_func() 函数调用。

参数

value

要检查的值。

syntax_only

如果设置为 true,则函数仅验证 value 可能是一个函数或方法。它将拒绝任何不是 可调用 对象、Closure字符串数组 且不具有可用作回调的有效结构的值。有效的可调用数组包含 2 个条目,第一个是对象或字符串,第二个是字符串。

callable_name

接收“可调用名称”,例如 "SomeClass::someMethod"。但是,请注意,尽管暗示 SomeClass::someMethod() 是一个可调用的静态方法,但事实并非如此。

返回值

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

示例

示例 #1 检查字符串是否可以作为函数调用

<?php

function someFunction() {}

$functionVariable = 'someFunction';

var_dump(is_callable($functionVariable, false, $callable_name));

var_dump($callable_name);

?>

以上示例将输出

bool(true)
string(12) "someFunction"

示例 #2 检查数组是否可以作为函数调用

<?php

class SomeClass
{
public function
someMethod() {}
}

$anObject = new SomeClass();

$methodVariable = [$anObject, 'someMethod'];

var_dump(is_callable($methodVariable, true, $callable_name));

var_dump($callable_name);

?>

以上示例将输出

bool(true)
string(21) "SomeClass::someMethod"

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

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

<?php

class Foo
{
public function
__construct() {}

public function
foo() {}
}

var_dump(
is_callable(['Foo', '__construct']),
is_callable(['Foo', 'foo'])
);

?>

以上示例将输出

bool(false)
bool(false)

注释

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

参见

添加注释

用户贡献的注释 2 个注释

35
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
?>
19
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