【PHP8.x】is_callable関数の使い方
is_callable関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
is_callable関数は、指定された変数が関数として呼び出し可能であるかどうかを判定する関数です。
この関数は、与えられた変数が実際に実行可能なコード、つまり関数やメソッドとして呼び出すことができる形式であるかを確認するために利用されます。具体的には、PHPのグローバル関数名を示す文字列、ClassName::methodNameのような静的メソッドを示す文字列、['ClassName', 'methodName']のような配列形式で指定される静的メソッド、または[$object, 'methodName']のようにオブジェクトとそのメソッドを指定する形式、さらには無名関数(クロージャ)などが「呼び出し可能」と判断されます。また、__invokeマジックメソッドを実装したクラスのインスタンスも、呼び出し可能なオブジェクトとして認識されます。
is_callable関数は、対象の変数が呼び出し可能であればtrue(真)を、そうでない場合はfalse(偽)を戻り値として返します。この関数は、特にコールバック関数として外部から値を受け取る際や、設定ファイルなどから動的に実行する処理を指定する際に非常に重要です。例えば、ユーザーからの入力や設定値として渡された文字列が、実際に存在する関数やメソッドの名前であるかを確認することで、未定義の関数を呼び出すことによるエラーを未然に防ぎ、プログラムの安全性と堅牢性を高めることができます。これにより、柔軟なプログラム設計が可能になるとともに、予期せぬ問題の発生を抑制することに貢献します。
構文(syntax)
1<?php 2function exampleFunction() { /* ... */ } 3var_dump(is_callable('exampleFunction')); 4?>
引数(parameters)
callable $value, bool $syntax_only = false, ?string &$callable_name = null
- callable $value: 呼び出し可能かどうかを判定する対象の値
- bool $syntax_only = false: trueを指定すると、構文のみのチェックを行う(実行はしない)
- ?string &$callable_name = null: 呼び出し可能な関数名やメソッド名が格納される変数(参照渡し)
戻り値(return)
bool
指定された変数が呼び出し可能なコールバックである場合にTRUEを、そうでない場合にFALSEを返します。
サンプルコード
PHP: is_callableとmethod_existsの違いを理解する
1<?php 2 3/** 4 * is_callable と method_exists の違いを示すサンプルコード。 5 */ 6 7class MyClass { 8 public function myMethod() { 9 return true; 10 } 11} 12 13$obj = new MyClass(); 14 15// 文字列でメソッド名を指定 16$methodName = 'myMethod'; 17 18// method_exists は、クラスにメソッドが存在するかどうかをチェックする 19if (method_exists($obj, $methodName)) { 20 echo "method_exists: MyClass に myMethod は存在します。\n"; 21} else { 22 echo "method_exists: MyClass に myMethod は存在しません。\n"; 23} 24 25// is_callable は、コールバックとして呼び出し可能かどうかをチェックする 26// コールバックは、関数名を表す文字列、メソッド名を表す配列、または Closure オブジェクトのいずれか 27if (is_callable([$obj, $methodName])) { 28 echo "is_callable: \$obj->myMethod は呼び出し可能です。\n"; 29} else { 30 echo "is_callable: \$obj->myMethod は呼び出し可能ではありません。\n"; 31} 32 33// 文字列のみの場合の挙動の違い 34$nonExistentMethod = 'nonExistentMethod'; 35 36if (!method_exists($obj, $nonExistentMethod)) { 37 echo "method_exists: MyClass に nonExistentMethod は存在しません。\n"; 38} else { 39 echo "method_exists: MyClass に nonExistentMethod は存在します。\n"; 40} 41 42if (!is_callable([$obj, $nonExistentMethod])) { 43 echo "is_callable: \$obj->nonExistentMethod は呼び出し可能ではありません。\n"; 44} else { 45 echo "is_callable: \$obj->nonExistentMethod は呼び出し可能です。\n"; 46} 47 48// 関数名の場合 49function myFunction() { 50 return true; 51} 52 53if (is_callable('myFunction')) { 54 echo "is_callable: myFunction は呼び出し可能です。\n"; 55} else { 56 echo "is_callable: myFunction は呼び出し可能ではありません。\n"; 57}
is_callable関数は、PHPの組み込み関数で、指定された変数がコールバックとして呼び出し可能かどうかを判定します。PHP8で利用可能です。引数 $value には、判定したい変数を指定します。オプションの引数 $syntax_only は、構文チェックのみを行うかを指定するbool値で、デフォルトは false です。$callable_name には、呼び出し可能な名前が文字列で返されます。戻り値は、呼び出し可能であれば true、そうでなければ false を返します。
このサンプルコードでは、is_callable と method_exists の違いを示しています。method_exists は、クラス内に指定された名前のメソッドが存在するかどうかをチェックするのに対し、is_callable は、変数が関数として呼び出し可能かどうかをチェックします。例えば、存在しないメソッド名を指定した場合、method_exists は false を返しますが、is_callable は配列 [$obj, 'nonExistentMethod'] の形式で、メソッドとして呼び出し可能かどうかを判定します。関数名の場合は、is_callable('myFunction') のように文字列で指定することで、その関数が定義されているかどうかを確認できます。is_callable は、文字列で関数名が指定された場合にも、グローバル空間にその関数が存在するかどうかを確認できます。この例では、myFunction が定義されているため、is_callable('myFunction') は true を返します。is_callable は、コールバック関数を扱う際に、事前に有効性を確認するために役立ちます。
is_callableとmethod_existsは似ていますが、役割が異なります。method_existsはクラスに指定された名前のメソッドが存在するかどうかを調べます。一方、is_callableは、与えられた値が関数やメソッドとして実際に呼び出せるかどうかを判定します。
is_callableは、関数名を表す文字列だけでなく、オブジェクトのメソッドを配列 [$obj, 'methodName'] の形式で指定することも可能です。また、is_callableは関数名のみの文字列も評価できます。存在しないメソッド名を文字列で指定した場合、method_existsはfalseを返しますが、is_callableは指定方法によってはtrueを返す可能性があるため注意が必要です。引数 $syntax_only を true にすると、シンタックスチェックのみを行い、実際に呼び出し可能かどうかは確認しません。