未定義の関数を呼び出したエラーの原因と直し方
存在しない名前の関数を呼び出したときに出るエラーです。関数名のタイプミスのほか、必要なファイルをrequireし忘れているときにも起こります。
エラーメッセージの読み方
Fatal error: Uncaught Error: Call to undefined function calcTtal() in main.php:5
main.php- ファイル名
5- 行番号 — 実際にクラッシュした行
Error- 例外クラス — 何が起きたか。ここを検索するのが最短です
Call to undefined function calcTtal()- 内容 — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 <?php 2 function calcTotal($a, $b) { 3 return $a + $b; 4 } 5 echo calcTtal (1, 2); ^
定義した関数名はcalcTotalですが、calcTtalという1文字違いの名前を呼び出しています。存在しない関数名はここで致命的エラーになります。
直し方: calcTtal を calcTotal にします。
パターン2
1 <?php 2 function sayHi($name) { 3 echo "Hi " . $name; 4 } 5 sayHii("Al"); ^
sayHiiという名前の関数は定義されていません。1文字でも違えば別の名前として扱われます。
直し方: sayHii を sayHi にします。
パターン3
1 <?php 2 function sumArray($arr) { 3 return array_sum($arr); 4 } 5 echo sumArry ([1, 2, 3]); ^
sumArryという名前は定義されていません。定義済みのsumArrayを呼び出す必要があります。
直し方: sumArry を sumArray にします。
パターン4
1 <?php 2 function fetchData() { 3 return 1; 4 } 5 echo fetchDta (); ^
定義した関数名はfetchDataですが、fetchDtaという1文字違いの名前を呼び出しています。
直し方: fetchDta を fetchData にします。
パターン5
1 <?php 2 function validateInput($x) { 3 return $x > 0; 4 } 5 var_dump(validateInpt (5)); ^
validateInptという名前は定義されていません。定義済みのvalidateInputを呼び出す必要があります。
直し方: validateInpt を validateInput にします。
よくある誤解
「関数名を間違えてもPHPが似た名前を探して実行してくれる」ということはありません。1文字でも違えば別の名前として扱われ、その場でプログラムが停止します。
実務での勘所
実務でこのエラーが起きる典型例は、単純なタイプミスよりもComposerのオートロード設定に関するものです。名前空間付きの関数やクラスを使っているのに、composer.jsonのautoloadの設定が正しくない、あるいはcomposer dump-autoloadを実行し忘れていると、ファイル自体は存在していても読み込まれず、未定義として扱われます。requireを忘れていないか調べる前に、まずcomposer dump-autoloadを試す価値があります。