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() 函式來呼叫它。

參數

要檢查的值。

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 則註解

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