php

Fatal error・Warning・Noticeって何?PHPのエラー文を読む方法

PHPを書いてブラウザで確認したら、突然こんな文字が表示された。

Warning: Undefined variable $name in /home/example/public_html/test.php on line 12

あるいは、

Fatal error: Uncaught Error: Call to undefined function...

英語。

知らない単語。

ファイルの場所。

数字。

なんだか一気に難しく見えます。

そして初心者のころは、

「とりあえずこのエラー文を全部AIに貼ろう」

となりがちです。

もちろん、それでも構いません。

でも実はPHPのエラー文は、全部を理解しなくても、

見る場所はだいたい決まっています。

今回は、PHPのエラー画面を見たときに、

「どこを見るのか」

を覚えていきましょう。


事件発生:突然こんなエラーが出た

たとえば、こんなPHPを書いたとします。

<?php

echo $name;

ところが、$nameにはまだ何も入れていません。

実行すると、環境によってはこんな表示が出ます。

Warning: Undefined variable $name in /home/example/test.php on line 3

長いですね。

でも、最初から全部読もうとしなくて大丈夫です。

見る場所を分けてみます。

Warning
Undefined variable $name
test.php
line 3

実はこれだけでも、かなり情報があります。


PHPのエラー文は「何が・どこで」を教えてくれる

先ほどのエラーを日本語っぽくすると、

Warning

$name という変数が定義されていません

test.php で

3行目にあります

という意味です。

つまりPHPは、

「何か問題があるよ」

と言っているだけではありません。

かなり具体的に、

何が起きたのか

どのファイルなのか

何行目なのか

まで教えてくれています。

エラー画面は、怖い文章ではなく、

調査メモ

だと思うと少し見やすくなります。


まず見るのはこの3つ

PHPのエラーが出たら、初心者のうちはまず次の3つを見てください。

1. エラーの種類

Warning
Fatal error
Notice
Parse error

など。

2. エラーの内容

Undefined variable
Undefined array key
Call to undefined function

など。

3. ファイル名と行番号

test.php on line 12

ここです。

全部の英語を訳す必要はありません。

この3つが分かれば、検索もAIへの相談もかなりしやすくなります。


Warningは「問題があるよ」

まずは、

Warning

です。

Warningは名前のとおり、

警告

です。

たとえば、

<?php

echo $name;

のように、まだ作っていない変数を使ったとします。

すると、

Warning: Undefined variable $name

と出ることがあります。

PHPとしては、

「$nameって変数、まだ作られてないけど大丈夫?」

と教えてくれているわけです。

Warningが出ても、処理そのものは続く場合があります。

ただし、

動いているから放置していい

という意味ではありません。

あとで不具合につながる可能性もあるので、原因は確認しましょう。


Noticeは「ちょっと気になるよ」

PHPでは環境やバージョンによって、

Notice

が表示されることもあります。

これはWarningよりも軽い注意として扱われることがあります。

イメージとしては、

Fatal error
↓
かなり重大

Warning
↓
問題あり

Notice
↓
確認したほうがいい

くらいで構いません。

ただしPHPのバージョンによって、以前NoticeだったものがWarningになるなど、扱いが変わることがあります。

そのため、

「Noticeなら絶対安全」

のように覚える必要はありません。

大事なのは、

エラーの種類によって深刻度が違う

と知っておくことです。


Fatal errorは「処理を続けられない」

次に、

Fatal error

です。

Fatalは「致命的な」という意味があります。

PHPでは、

このまま処理を続けられない

ような問題が起きたときに表示されます。

たとえば、

<?php

hello_world();

というコードを書いたとします。

ところが、

function hello_world()

という関数をどこにも作っていません。

すると、

Fatal error: Uncaught Error: Call to undefined function hello_world()

のようなエラーになることがあります。

PHPからすれば、

「hello_worldって関数を呼べと言われたけれど、そんな関数知らない!」

という状態です。

Fatal errorになると、そこで処理が止まります。


Parse errorは「PHPとして読めない」

PHPを書いていると、

Parse error

に遭遇することもあります。

たとえば、

<?php

echo "こんにちは"

本来必要な、

;

がありません。

正しくは、

<?php

echo "こんにちは";

です。

PHPがコードを読み取ろうとして、

「文法として解釈できません」

となったときにParse errorが起こります。

よくある原因としては、

  • ;の付け忘れ
  • "や'の閉じ忘れ
  • )の閉じ忘れ
  • }の閉じ忘れ

などがあります。

AIにコードを書いてもらった場合でも、コピー時に一部が欠けたり、自分で修正した場所で記号を消してしまったりすることがあります。


「on line 12」はかなり重要

エラー文の最後によく出る、

on line 12

これは、

12行目付近で問題が見つかった

という意味です。

たとえば、

Warning: Undefined variable $name in test.php on line 12

なら、

まずtest.phpの12行目を見ます。

これだけで、100行あるPHPを最初から全部読み直す必要がなくなります。


ただし「その行が犯人」とは限らない

ここは少し重要です。

エラーに、

line 12

と書いてあるからといって、

必ず12行目そのものが原因とは限りません。

たとえば、

<?php

$message = "こんにちは;

echo $message;

この場合、最初の文字列の、

"

を閉じ忘れています。

PHPはその後もコードを読み続け、

「ここまで読んだけど、おかしい」

となった場所をエラーとして表示することがあります。

つまり、

line 12

と表示されたら、

12行目だけではなく、その少し上も見る

のがコツです。


エラー文を全部理解する必要はない

たとえばこんなエラーが出たとします。

Fatal error: Uncaught TypeError: htmlspecialchars(): Argument #1 ($string) must be of type string, array given in /home/example/public_html/test.php:15

初心者が見ると、

「無理!」

となりそうです。

でも全部理解しなくても、

Fatal error

処理が止まるレベルのエラー。

htmlspecialchars()

この関数周辺で問題が起きている。

test.php

このファイル。

15

15行目付近。

ここまでは読み取れます。

さらに、

array given

という部分があるので、

配列が関係していそう

とも分かります。

分からない英単語があっても、

分かるところから切り分ければいい

ということです。


AIに聞くなら、エラー文を省略しない

AIに相談するとき、

PHPが動きません。

だけでは、AIもかなり広い範囲から原因を推測しなければなりません。

できれば、

Fatal error: Uncaught Error: Call to undefined function hello_world()

のように、

エラー文そのもの

を貼りましょう。

さらに、

test.phpの23行目付近で出ています。

と伝えたり、その周辺のコードも一緒に見せれば、かなり調査しやすくなります。

たとえば、

このPHPを実行すると次のエラーが出ます。

Fatal error: Uncaught Error: Call to undefined function hello_world()

test.phpの23行目です。

原因を初心者向けに説明して、修正箇所を教えてください。

くらいで十分です。


エラー文を検索するときも、そのままでいい

Googleなどで調べる場合も同じです。

たとえば、

Undefined variable

が出たら、

PHP Undefined variable

で検索できます。

Call to undefined function

なら、

PHP Call to undefined function

です。

エラー文は、

検索キーワードそのもの

にもなります。

分からない英語だから消すのではなく、

むしろその英語を使って調べる

くらいで大丈夫です。


エラーの「種類」と「内容」は別

ここで一度整理します。

たとえば、

Warning: Undefined variable $name

なら、

Warning

がエラーの種類。

Undefined variable $name

が、実際に起きている内容です。

同じWarningでも、

Undefined array key

だったり、

include(): Failed to open stream

だったり、内容は変わります。

だから、

Warningを直す方法

というひとつの答えがあるわけではありません。

重要なのは、その後ろに書かれている、

「何が起きたのか」

です。


エラー文が出ないこともある

ここまで、

「PHPはエラーを教えてくれる」

と説明しました。

ところが実際のサーバーでは、PHPエラーが画面に表示されないことがあります。

その場合、

  • 真っ白になる
  • 500エラーになる
  • 何も表示されない

こともあります。

以前のPHP学科で扱った、

「PHPの真っ白画面」

にもつながります。

本番サイトでは、エラー内容を訪問者にそのまま見せないよう設定されているケースがあるためです。

その場合は、

PHPのエラーログ

を見る必要が出てきます。

この話は、また別の回で扱いましょう。


今日の合格ライン

今回すべてのPHPエラーを覚える必要はありません。

PHPのエラーが出たら、まずこの3つを探してください。

エラーの種類

Warning
Fatal error
Parse error

など。

何が起きたのか

Undefined variable
Undefined array key
Call to undefined function

など。

どこなのか

test.php on line 12

です。

つまり、

何が起きた?
どのファイル?
何行目?

これが分かれば合格です。


ワンポイント答え合わせ

次のエラーが出ました。

Warning: Undefined variable $email in contact.php on line 18

どこから確認すればよいでしょう?

A:すべてのPHPファイルを最初から確認する

B:contact.phpの18行目付近で$emailがどう使われているか確認する

答えは、

Bです。

さらに18行目だけではなく、その少し上で、

$email = ...

が正しく作られているかも確認するとよいでしょう。

エラー文は、

「失敗しました」という通知ではありません。

「ここを調べてみて」というヒントです。

読める部分だけ拾っていけば、PHPのエラー調査はかなり楽になります。

☆ この授業をあとで見返す

学生登録(無料)すると、お気に入りに保存できます。授業は登録しなくても読めます。

☆ この授業をあとで見返す

学生登録(無料)すると、お気に入りに保存できます。授業は登録しなくても読めます。