PHPでよく発生するエラーの意味と原因と解決方法

Web開発PHP

プログラミングをやっていると必ずぶつかる壁がエラーの解決です。
しかも、エラーが発生すると全て英語で書かれていて、なんかコードがズラーっと表示されるんですよね。

結果、エラーの意味がわからない → 解決できない → 前に進まない → 挫折というコンボが発生します。

そうならないため、この記事ではPHPでよく発生するエラーについて

  • そのエラーがどういう意味なのか
  • どういう時に発生するのか
  • どうすれば解決できるのか

を解説していきます。

そして、少しでもPHP初学者の方がプログラミングを挫折しないよう、手助けになればと思います。

そもそも “エラー" とは何か

エラー、バグ、不具合、障害とか言われますよね。
どれも同じような意味で使われることがありますが、実際にはそれぞれ明確に意味が分かれています。

エラー、バグ・不具合、障害の違い
  • エラー
    • 人為的に引き起こされるプログラム上のミス
    • プログラミングにおいては、スペルミス/文法ミス/型の不一致など
  • バグ・不具合
    • システムのある機能について、正常に動作しないこと(正常:決められた仕様)
    • 必ずしもエラーが発生するとは限らない
  • 障害
    • 何らかの原因によって、システムやサービスが正常に動作していないこと、また、そのような状態

つまり、

  1. 障害(システム正常に動作しない)が発生した
  2. 障害の内容は、◯◯機能のバグ・不具合(◯◯機能が意図しない動作をしている)です
  3. (場合により)バグ・不具合の原因は◯◯というエラー(プログラム上のミス)です

というイメージですね。

PHPでよく発生するエラー

前項の解説から、今回の記事でPHPでよく発生するプログラム上のミス、すなわちエラーについて解説していくということになります。

スペルミス/文法ミス/型の不一致など、様々な原因のエラーがありますので、一つずつ見ていきたいと思います。

Undefined variable: {変数名} in □□/△△/◯◯.php on line {行番号}

このエラーは使おうとした変数が定義されていないため、変数を読み込めませんというエラーです。
PHPをやっていて恐らく一番目にするエラーではないかと思います。

このエラーが発生した場合に一番最初に疑うのは変数名の間違い、すなわちタイプミス(typo:タイポ)です。
本当であれば変数名は $name であるところを $neme にしてしまうと Undefined variable: neme というエラーが発生します。

これは初学者/経験者とはずあるあるですね。

<?php

$name = '山田 太郎';
echo $nam;              // Notice: Undefined variable: nam in ...

他に、文字通り、事前に定義していない/初期化していないというパターンです。
そもそも定義できていなければ使用できません。

<?php

$last_name = '山田';
$first_name = '太郎';
echo $name;              // Notice: Undefined variable: name in ...

Undefined index: {キー名} in □□/△△/◯◯.php on line {行番号}

このエラーは連想配列にないキーを指定しようとした場合に発生するエラーです。

<?php

$user = ['name' => '山田 太郎'];
echo $user['email'];              // Notice: Undefined index: email in ...

if文で以下のようなことやりがちで、このエラーに遭遇します。
・定義していないキーで条件を判定しようとしている
・分岐の中でしかキーを設定していない

<?php

// 定義していないキーで条件を判定しようとしている
$user = ['name' => '山田 太郎'];
if ($user['email']) {             // Notice: Undefined index: email in ...
    echo $user['email'];          // Notice: Undefined index: email in ...
}


// キーが存在するか確認することで回避できます
$user = ['name' => '山田 太郎'];
if (isset($user['email'])) {
    echo $user['email'];          // 山田 太郎
}
<?php

// 分岐の中でしかキーを設定していない
//    以下の場合、if文の中に入らないため、echoの時にemailがない状態になってしまっている
$user = ['name' => '山田 太郎', 'age' => 30];
if ($user['age'] <= 25) {
    $user['email'] = 't.yamada@gmail.com';
}
echo $user['email'];          // Notice: Undefined index: email in ...


// これはあらかじめキーを設定することで回避できます
$user = ['name' => '山田 太郎', 'age' => 30, 'email' => 'sample@gmail.com'];   // ←emailを追加
if ($user['age'] <= 25) {
    $user['email'] = 't.yamada@gmail.com';
}
echo $user['email'];          // sample@gmail.com

Undefined offset: {位置番号} in □□/△△/◯◯.php on line {行番号}

このエラーは Undefined index と似ていますが、連想配列ではなく通常の配列のキー(位置)が定義されていない場合に発生します。

<?php

$user = [];
echo $user[0];          // Notice: Undefined offset: 0 in ...

$user = null;
echo $user[5];          // Notice: Undefined offset: 5 in ...

$user = ['山田 太郎', '鈴木 花子'];
echo $user[0];          // 山田 太郎

このエラーはfor文を使用する時によく発生しやすいですね。

<?php

$user = [];
for ($i=0; $i < 10; $i++) {
    echo $user[$i];          // Notice: Undefined offset: 0 in ...
}

Invalid argument supplied for foreach() in □□/△△/◯◯.php on line {行番号}

本来、foreach文には配列を引数とすることで、配列内の値を順番に取得する(ループする)ことができるのですが、誤って配列以外の値を引数とすると、このエラーが発生します。

<?php

$user = null;
foreach ($user as $key => $value) {    // Worning: Invalid argument supplied  for foreach() in ...
    echo $value.' '; 
}

$user = '山田 太郎';
foreach ($user as $key => $value) {    // Worning: Invalid argument supplied for foreach() in ...
    echo $value.' '; 
}

$array = ['山田 太郎', '鈴木 花子'];
foreach ($user as $key => $value) {
    echo $value.' ';                       // 山田 太郎 鈴木 花子
}

よくやる失敗としては、関数からの戻り値を分岐で制御している場合に、特定の条件の返り値を配列にし忘れることがあります。

<?php

function getCompnany($company) {
    if ($company === 'apple') {
        return [
            'company' => 'Apple',
            'os'      => 'mac'
        ];
    }
}

$company = getCompany('microsoft');
foreach ($company as $key => $value) {
    echo "{$key}→{$value}";
}

この場合、getCompany関数の引数に'apple'以外の値が渡された場合、if文の分岐内に入らないため、getCompany関数はnullを返すことになります。
そのため、foreach文で使われる$companyがnullであるため、エラーが発生してしまいます。

この場合は、if文にelseを追加するか、if文の後ろに return []; とすることで、foreach文でエラーを発生させないようにすることができます。


以上がPHPでよく発生するエラーの意味と解決方法になります。

特に初学者にとってエラーは恐怖かもしれませんが、一方で、自分のスキルを高めてくれる壁になってくれます。
落ち着いて一つ一つ確認して対処していきましょう。