@ PHP

error:エラー

PHP の開発を進めると、文法のミスや実行時のエラーなど、様々な場面でエラーが発生します。

エラーの種類とエラー定数

PHPのエラーには、発生するエラーに応じて、エラーレベルが決まっています。ここでは、それぞれのエラーの概要と、エラーが発生したときの対処方法について、PHPに定義されているエラー番号(定数)別に解説します。

エラーは、重要度の高い順に、E_PARSE、E_ERROR、E_WARNING、E_NOTICE、E_DPRECATED があります。

E_PARSE

E_PARSE は PHP のパースエラー(シンタックスエラー)です。このエラーは、文末のセミコロンを付け忘れた場合や括弧の対応があっていなかった場合などに発生します。このエラーは
PHP 実行環境がその PHP ファイルを読み込んだ時点で発生し、そのファイルは実行されることなくエラーを出力して終了します。

error_01.php

<?php
echo 'テストプログラム開始';
$a = 1;
if(isset($a){      //  ← 閉じ括弧が1つ足りない
    echo '$aはセットされている';
}
echo 'テストプログラム終了';
?>

このコードを実行すると、次のようなエラーが発生します

Parse error: syntax error, unexpected '{' in C:\xampp\htdocs\test\index.php on line 4

エラー箇所は、if 構文の始まる4行目ですが、それ以前に記述された echo 文も実行されていないことがわかります。

E_ERROR

E_ERROR は実行時の致命的なエラーです。このエラーは、定義されていない関数を呼び出したり、すでに定義されているクラスや関数をもう一度定義してしまったりした場合に発生します。このエラーが発生すると、プログラムの実行はその時点で終了してしまいます。

error_02.php

<?php
echo 'テストプログラム開始';
class foo {}
class foo {}      //  ← 同じ名前のクラスを定義している
echo 'テストプログラム終了';
?>

このコードを実行すると、次のようなエラーが発生します

テストプログラム開始
Fatal error: Cannot declare class foo, because the name is already in use in C:\xampp\htdocs\test\index.php on line 4

実行時の致命的なエラーは、エラーが発生するまでのプログラムは通常通り実行され、エラーが発生した時点で終了します。このため、エラーがある4行目までの echo 文は実行されていることがわかります。

E_WARNING

E_WARNING は実行時の警告です。この警告は、呼び出す関数の引数の型を間違えたり、呼び出す引数の数を間違えたりした場合に発生します。この警告は、その警告が発生した時点でその式の評価や文の実行が停止します。E_WARNING は、発生しても実行は継続されるものの、プログラムがよきせぬ挙動を示しそれ以後のプログラムが正常に動作しない場合があります。

error_03.php

<?php
echo 'テストプログラム開始';
$ret1 = array_reverse();      //  ← 引数の間違い
$ret2 = array_reverse(1);      //  ← 引数の型の間違い
echo 'テストプログラム終了';
?>

このコードを実行すると、次のようなエラーが発生します

テストプログラム開始
Warning: array_reverse() expects at least 1 parameter, 0 given in C:\xampp\htdocs\test\index.php on line 3
Warning: array_reverse() expects parameter 1 to be array, integer given in C:\xampp\htdocs\test\index.php on line 4
テストプログラム終了

このプログラムでは、array_reverse() 関数の引数の間違えと引数の型の間違えで警告が発生しています。

このサンプルでもっとも重要なポイントは、このとき、関数の返り値を受け取っている $ret1 や $ret2 には何が代入されているかです。このサンプルでは、array_revers() 関数の呼び出し方を間違えたことによって、結果的に array_revers() 関数は呼び出されずに処理が継続されます。つまり、変数 $ret1 と $ret2 は null になっているのです。開発者が $ret1 や $ret2 に array_revers() 関数の返り値として配列を受け取っているつもりで次に続くプログラムを書き続けていた場合、この先さらに警告が発生される場合もありますし、ユーザに使われるプログラムで予期しない結果が出力されてしまうかも知れません。E_WARNING も発生した理由や箇所がわかりやすく出力されるで、原因を特定し、修正する必要があります。

E_NOTICE

E_NOTICE も実行時の警告ですが、E_WARNING よりも重要度が低いとされています。この警告が発生した場合、PHP は警告を発生させつつ、自動的に対処をほどこします。

次の例では、初期化も代入もされていない未知の変数や定数を出力しようとしています。

error_04.php

<?php
error_reporting(E_NOTICE);
echo 'テストプログラム開始';
echo (int)$foo;
echo FOO;
echo 'テストプログラム終了';
?>

このコードを実行すると、次のようなエラーが発生します

テストプログラム開始
Notice: Undefined variable: foo in C:\xampp\htdocs\test\index.php on line 4
Notice: Use of undefined constant FOO - assumed 'FOO' in C:\xampp\htdocs\test\index.php on line 5
テストプログラム終了

E_WARNING と違う点は、PHP が自動的に何かしらの対処を施そうとしている点です。たとえば、この例では、$foo は初期化されていない変数であるため、自動的に null となります(null を出力すると空文字となってしまい結果に表示されないため、サンプルでは整数にキャストしています。このため 0 が出力されています)。また、定数 FOO を出力しようとした際、FOO は定数定義されていないため、文字列 “FOO” であるとみなされています。このため、出力では、”FOO” と出力されています。

E_DEPRECATED

E_DEPRECATED は過去に許されていた文法や関数が現行のバージョンでは非推奨となっていて、将来的に廃止されるもの使った場合に出力されます。警告が表示されても、実際に廃止されるまでは動作します。

error_05.php

<?php
echo 'テストプログラム開始';
class Pager
{
    function Pager(){}
}
echo 'テストプログラム終了';
?>

このコードを実行すると、次のようなエラーが発生します。これは、Pager がクラス名と同名のコンストラクタで非推奨であるという警告です。

テストプログラム開始
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; Pager has a deprecated constructor in C:\xampp\htdocs\test\pra01.php on line 3
テストプログラム終了

E_DEPRECATED が発生した場合は、そのコードを修正するとともに、今後使わないようにすることが重要です。

エラーに関する設定

error_reporting()

PHP には多くのエラーレベルがあり、 error_reporting() は、エラーのうちでどのレベルのエラーを報告するかを設定します。

報告するエラーレベルは、引数にエラー定数のビット表現を用いて設定ができます。

引数を複数指定するには論理演算を行います。数値で指定する場合はビット値を足した値を設定する事も可能ですが、定数名を使う方が推奨されています。

デフォルトの設定は 2039 (E_ALL~E_NOTICE)です。

error_06.php

<?php

// 全てのエラー出力をオフにす
error_reporting(0);

// 単純な実行時エラーを表示する
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// E_NOTICE を表示させるのもおすすめ(初期化されていない
// 変数、変数名のスペルミスなど…)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// E_NOTICE 以外の全てのエラーを表示する
error_reporting(E_ALL & ~E_NOTICE);

// 全ての PHP エラーを表示する (Changelog を参照ください)
error_reporting(E_ALL);

// 全ての PHP エラーを表示する
error_reporting(-1);

// error_reporting(E_ALL); と同じ
ini_set('error_reporting', E_ALL);

?>

php.ini でこの設定を変更する場合は次のようにします。

php.ini

error_reporting = E_ALL & ~E_NOTICE~;
エラー定数とビット値一覧
定数名 ビット値
E_ERROR 1
E_WARNING 2
E_PARSE 4
E_NOTICE 8
E_CORE_ERROR 16
E_CORE_WARNING 32
E_COMPILE_ERROR 64
E_COMPILE_WARNING 128
E_USER_ERROR 256
E_USER_WARNING 512
E_USER_NOTICE 1024
E_ALL 2047
E_STRICT 2048