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) を入れ、その変数が本当に関数名(文字列)やクロージャになっているかを確認します。NULL や int なら、それが原因です。Qcall_user_funcを使えば直りますか?
A根本対処にはなりません。
call_user_func() も中身が null や不正値なら失敗します。呼び出す前に is_callable() で確認するのが確実です。Qis_callableとfunction_existsの違いは?
A
function_exists() は関数名の文字列に対するチェックです。is_callable() は文字列に加えてクロージャや [$obj, "method"] 形式も判定できるため、汎用的に使えます。まとめ
このエラーへの対処を整理します。
- 原因は
$var()の$varが文字列・クロージャ・callable配列でない(null・数値など) - 変数に関数名の文字列を入れて呼ぶのは正常(誤解しやすい点)
- 最多は未設定のコールバック変数(null)を呼ぶケース
- 対処は呼ぶ前に
is_callable()でガード - 関数名限定のチェックなら
function_exists()
関連として、Call to undefined function の対処法・Undefined variable の解決方法・Class not found の解決方法もあわせて読むと、PHPのエラー対処に強くなれます。

