プログラミングをやっていると必ずぶつかる壁がエラーの解決です。
しかも、エラーが発生すると全て英語で書かれていて、なんかコードがズラーっと表示されるんですよね。
結果、エラーの意味がわからない → 解決できない → 前に進まない → 挫折というコンボが発生します。
そうならないため、この記事ではPHPでよく発生するエラーについて
- そのエラーがどういう意味なのか
- どういう時に発生するのか
- どうすれば解決できるのか
を解説していきます。
そして、少しでもPHP初学者の方がプログラミングを挫折しないよう、手助けになればと思います。
そもそも “エラー” とは何か
エラー、バグ、不具合、障害とか言われますよね。
どれも同じような意味で使われることがありますが、実際にはそれぞれ明確に意味が分かれています。
- エラー- 人為的に引き起こされるプログラム上のミス
 - プログラミングにおいては、スペルミス/文法ミス/型の不一致など
 
- バグ・不具合- システムのある機能について、正常に動作しないこと(正常:決められた仕様)
- 必ずしもエラーが発生するとは限らない
 
- 障害- 何らかの原因によって、システムやサービスが正常に動作していないこと、また、そのような状態
 
つまり、
- 障害(システム正常に動作しない)が発生した
- 障害の内容は、◯◯機能のバグ・不具合(◯◯機能が意図しない動作をしている)です
- (場合により)バグ・不具合の原因は◯◯というエラー(プログラム上のミス)です
というイメージですね。
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.comUndefined 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でよく発生するエラーの意味と解決方法になります。
特に初学者にとってエラーは恐怖かもしれませんが、一方で、自分のスキルを高めてくれる壁になってくれます。
落ち着いて一つ一つ確認して対処していきましょう。

 
  
  
  
  
