【PHP】Fatal error: Function name must be a string の原因と対処法

PHPで「Fatal error: Function name must be a string」というエラーは、変数を関数として呼び出す($var()ときに、その変数が関数名の文字列でもクロージャでもない値null や数値など)だった場合に発生します。この記事では正確な原因と、安全に呼び出すための対処法を解説します。

この記事の結論:$var()$var文字列・クロージャ・callable配列のいずれでもないnull・数値・真偽値など)とこのエラーになります。呼び出す前に is_callable($var) でチェックするのが確実な対処です。
スポンサーリンク

前提:変数に関数名を入れて呼び出すのは正しい

まず誤解しやすい点を整理します。変数に関数名(文字列)を入れて $var() で呼び出すのは正しい使い方で、これ自体はエラーになりません(変数関数)。

OK: 変数関数は正常に動く
<?php
$fn = "strtoupper";
echo $fn("hello"); // HELLO(エラーにならない)

$f = fn($x) => $x * 2; // クロージャ
echo $f(5); // 10

エラーの本当の原因

エラーになるのは、$var()$var関数名の文字列でも、クロージャでも、[$obj, "method"] のようなcallable配列でもないときです。具体的には null・数値・真偽値などです。

NG: 文字列でない値を呼び出している
<?php
$n = 5;
$n(); // Fatal error: Function name must be a string

$x = null;
$x(); // Fatal error: Function name must be a string
最も多いのは「コールバック用の変数が未設定(null)のまま呼ばれる」ケースです。設定配列やフォーム、DBから受け取った値を関数として呼ぶ設計で、その値がセットされていないと null() となりこのエラーになります。
ありがちな実例
<?php
$config = []; // handler を入れ忘れ
$handler = $config["handler"] ?? null;

$handler(); // $handler は null → Function name must be a string

対処法:is_callableで安全に呼び出す

呼び出す前に is_callable() で「呼び出せる値かどうか」を確認します。これは関数名の文字列・クロージャ・callable配列のいずれにも対応できる、最も確実な方法です。

is_callableでガード
<?php
$handler = $config["handler"] ?? null;

if (is_callable($handler)) {
    $handler();
} else {
    // 未設定・不正な値のときの処理
    echo "ハンドラーが設定されていません";
}

「関数名の文字列であること」だけを確認したいなら function_exists() も使えます。クロージャやメソッドも許容したい場合は is_callable() のほうが適切です。

function_existsでチェック
<?php
$functionName = "someFunction";

if (function_exists($functionName)) {
    $functionName();
} else {
    // 関数が存在しないときの処理
}
call_user_func($var) でも関数を呼べますが、$var が null や不正値なら結局失敗します。根本対処は「呼ぶ前に is_callable() で確認する」ことです。

似たエラーとの切り分け

エラー 典型的な原因
Function name must be a string $var()$var が null・数値など
Call to undefined function 関数名は文字列だが、その名前の関数が存在しない
Class ‘xxx’ not found 配列を () で呼び、要素がクラス名扱いになった
存在しない関数を呼んだ場合はCall to undefined function の原因と対処法、クラスが見つからない場合はClass not found の解決方法、変数自体が未定義のときはUndefined variable の原因と解決方法を参照してください。

よくある質問(FAQ)

Q変数に関数名を入れて呼ぶとこのエラーになりますか?
Aなりません。$fn = "strtoupper"; $fn("hi"); のように文字列の関数名なら正常に動きます。エラーになるのは、変数が null や数値など呼び出せない値のときです。
Q原因の変数を素早く特定するには?
A呼び出し箇所の直前で var_dump($var) を入れ、その変数が本当に関数名(文字列)やクロージャになっているかを確認します。NULLint なら、それが原因です。
Qcall_user_funcを使えば直りますか?
A根本対処にはなりません。call_user_func() も中身が null や不正値なら失敗します。呼び出す前に is_callable() で確認するのが確実です。
Qis_callableとfunction_existsの違いは?
Afunction_exists()関数名の文字列に対するチェックです。is_callable() は文字列に加えてクロージャや [$obj, "method"] 形式も判定できるため、汎用的に使えます。

まとめ

このエラーへの対処を整理します。

  • 原因は $var()$var が文字列・クロージャ・callable配列でない(null・数値など)
  • 変数に関数名の文字列を入れて呼ぶのは正常(誤解しやすい点)
  • 最多は未設定のコールバック変数(null)を呼ぶケース
  • 対処は呼ぶ前に is_callable() でガード
  • 関数名限定のチェックなら function_exists()

関連として、Call to undefined function の対処法Undefined variable の解決方法Class not found の解決方法もあわせて読むと、PHPのエラー対処に強くなれます。