Code Fix

初級

未定義の関数を呼び出したエラーの原因と直し方

存在しない名前の関数を呼び出したときに出るエラーです。関数名のタイプミスのほか、必要なファイルを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);
             ^
Fatal error: Uncaught Error: Call to undefined function calcTtal() in main.php:5

定義した関数名はcalcTotalですが、calcTtalという1文字違いの名前を呼び出しています。存在しない関数名はここで致命的エラーになります。

直し方: calcTtal を calcTotal にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  <?php
 2  function sayHi($name) {
 3      echo "Hi " . $name;
 4  }
 5  sayHii("Al");
       ^
Fatal error: Uncaught Error: Call to undefined function sayHii() in main.php:5

sayHiiという名前の関数は定義されていません。1文字でも違えば別の名前として扱われます。

直し方: sayHii を sayHi にします。

この問題を解いてみる →

パターン3

 1  <?php
 2  function sumArray($arr) {
 3      return array_sum($arr);
 4  }
 5  echo sumArry  ([1, 2, 3]);
             ^
Fatal error: Uncaught Error: Call to undefined function sumArry() in main.php:5

sumArryという名前は定義されていません。定義済みのsumArrayを呼び出す必要があります。

直し方: sumArry を sumArray にします。

この問題を解いてみる →

パターン4

 1  <?php
 2  function fetchData() {
 3      return 1;
 4  }
 5  echo fetchDta  ();
              ^
Fatal error: Uncaught Error: Call to undefined function fetchDta() in main.php:5

定義した関数名はfetchDataですが、fetchDtaという1文字違いの名前を呼び出しています。

直し方: fetchDta を fetchData にします。

この問題を解いてみる →

パターン5

 1  <?php
 2  function validateInput($x) {
 3      return $x > 0;
 4  }
 5  var_dump(validateInpt  (5));
                    ^
Fatal error: Uncaught Error: Call to undefined function validateInpt() in main.php:5

validateInptという名前は定義されていません。定義済みのvalidateInputを呼び出す必要があります。

直し方: validateInpt を validateInput にします。

この問題を解いてみる →

よくある誤解

「関数名を間違えてもPHPが似た名前を探して実行してくれる」ということはありません。1文字でも違えば別の名前として扱われ、その場でプログラムが停止します。

実務での勘所

実務でこのエラーが起きる典型例は、単純なタイプミスよりもComposerのオートロード設定に関するものです。名前空間付きの関数やクラスを使っているのに、composer.jsonのautoloadの設定が正しくない、あるいはcomposer dump-autoloadを実行し忘れていると、ファイル自体は存在していても読み込まれず、未定義として扱われます。requireを忘れていないか調べる前に、まずcomposer dump-autoloadを試す価値があります。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)