PHPでよく発生するエラーの意味と原因と解決方法
プログラミングをやっていると必ずぶつかる壁がエラーの解決です。
しかも、エラーが発生すると全て英語で書かれていて、なんかコードがズラーっと表示されるんですよね。
結果、エラーの意味がわからない → 解決できない → 前に進まない → 挫折というコンボが発生します。
そうならないため、この記事では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.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でよく発生するエラーの意味と解決方法になります。
特に初学者にとってエラーは恐怖かもしれませんが、一方で、自分のスキルを高めてくれる壁になってくれます。
落ち着いて一つ一つ確認して対処していきましょう。