🅿️

PHP初心者必見!エラーを防ぐために知っておくべき10のコーディングポイント!+おまけ8

に公開

はじめに

PHP は柔軟な言語ですが、書き方によっては NoticeWarning などのエラーが発生しやすくなります。
これらのエラーはコードの品質を低下させ、予期せぬバグの原因になることがあります。
本記事では、PHP で NoticeWarning を回避するために注意すべきコーディングのポイントを紹介します。

対象読者

  • PHP を使い始めたばかりの初心者エンジニア
  • PHP のエラーハンドリングに慣れていないエンジニア
  • Notice や Warning エラーを減らし、安定したコードを作成したい方

事前準備

  • 基本的な PHP の構文に慣れていること
  • error_reportingdisplay_errors 設定の理解があること(開発環境でのエラーメッセージの表示に役立つ)

1. 未定義の変数を使用しない

❌ よくある間違い

$sum = $a + $b; // $a, $b が未定義だと Notice 発生

✅ 解決策

  • 変数を事前に定義する。
  • isset() で存在チェックを行う。
  • null合体演算子(??) を活用する。
$a = 10;
$b = 20;
$sum = $a + $b;
$sum = ($a ?? 0) + ($b ?? 0);

2. 配列のキー存在チェック

❌ よくある間違い

echo $data['name']; // 'name' キーが未定義の場合、Notice 発生

✅ 解決策

  • isset() または array_key_exists() を使用する。
echo isset($data['name']) ? $data['name'] : 'デフォルト値';
echo $data['name'] ?? 'デフォルト値';

3. ファイルの存在チェック

❌ よくある間違い

$contents = file_get_contents('non_existent_file.txt'); // Warning 発生

✅ 解決策

  • file_exists() で事前にチェックする。
if (file_exists('non_existent_file.txt')) {
    $contents = file_get_contents('non_existent_file.txt');
} else {
    echo 'ファイルが見つかりません';
}

4. includerequire のエラーハンドリング

❌ よくある間違い

include 'config.php'; // ファイルが存在しない場合、Warning 発生

✅ 解決策

  • file_exists() でチェックする。
  • @ 演算子は使用せず、適切な例外処理を行う。
$file = 'config.php';
if (file_exists($file)) {
    include $file;
} else {
    echo '設定ファイルが見つかりません';
}

5. foreach で未定義の変数を使わない

❌ よくある間違い

foreach ($items as $item) { // $items が未定義の場合、Warning 発生
    echo $item;
}

✅ 解決策

  • is_array() または empty() でチェックする。
if (!empty($items) && is_array($items)) {
    foreach ($items as $item) {
        echo $item;
    }
}

6. 関数の戻り値を適切にチェックする

❌ よくある間違い

$result = some_function();
if ($result) {
    echo '成功';
} else {
    echo '失敗';
}

このコードでは、関数 some_function()falsenull を返す場合に期待通りに動作しない可能性があります。

✅ 解決策

  • 厳密な型チェックを行う。
  • === を使用する。
$result = some_function();
if ($result !== false && $result !== null) {
    echo '成功';
} else {
    echo '失敗';
}

7. デフォルトのタイムゾーンを設定する

❌ よくある間違い

echo date('Y-m-d H:i:s'); // タイムゾーンが未設定だと Warning 発生

✅ 解決策

  • date_default_timezone_set() を使用する。
date_default_timezone_set('Asia/Tokyo');
echo date('Y-m-d H:i:s');

8. error_reporting の適切な設定

開発環境では E_ALL を設定し、すべてのエラーを検出できるようにします。

error_reporting(E_ALL);
ini_set('display_errors', 1);

本番環境ではエラーメッセージを表示せず、ログに記録するようにします。

error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', '/path/to/error.log');

9. 変数のスコープに注意する

❌ よくある間違い

function example() {
    $x = 10;
}
echo $x; // Notice: Undefined variable

✅ 解決策

  • 関数内の変数はローカルスコープなので外からは参照できません。
  • 変数を返す、またはグローバル変数を使う。

10. 配列の要素にアクセスする際のインデックスの型に注意する

❌ よくある間違い

$data = array('a' => 1, 'b' => 2);
echo $data[1]; // Notice: Undefined index

✅ 解決策

  • 正しいキーでアクセスする。
echo $data['a']; // 正しいキーでアクセス

11. 数値の除算におけるゼロ除算のエラー

❌ よくある間違い

$div = 10 / 0; // Warning: Division by zero

✅ 解決策

  • 除算前にゼロチェックを行う。
if ($b != 0) {
    $div = $a / $b;
} else {
    echo 'ゼロ除算エラー';
}

12. リソース型を正しく扱う

❌ よくある間違い

$file = fopen('file.txt', 'r');
fclose($file);  // fclose でファイルポインタを閉じる前にエラーが発生した場合、Warning 発生

✅ 解決策

  • エラーハンドリングを行い、リソースが正常にオープンされたかを確認する。
$file = fopen('file.txt', 'r');
if ($file) {
    fclose($file);
} else {
    echo 'ファイルオープンエラー';
}

13. NULL の比較に注意する

❌ よくある間違い

$value = null;
if ($value == '0') { // Notice: Trying to compare null with string
    echo '一致';
}

✅ 解決策

  • === 演算子を使用して、型と値を厳密に比較する。
if ($value === null) {
    echo 'nullと一致';
}

14. empty() の使い方

❌ よくある間違い

if (empty($data['key'])) {  // Warning if $data is not set
    echo 'キーが空';
}

✅ 解決策

  • isset() で存在を確認した後、empty() を使う。
if (isset($data['key']) && empty($data['key'])) {
    echo 'キーが空';
}

15. filter_var() の使用

❌ よくある間違い

$email = 'invalid_email';
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {  // Warning 発生
    echo '有効なメールアドレス';
}

✅ 解決策

  • filter_var() の戻り値を明示的に確認する。
if (filter_var($email, FILTER_VALIDATE_EMAIL) !== false) {
    echo '有効なメールアドレス';
} else {
    echo '無効なメールアドレス';
}

16. unset() した変数を参照しない

❌ よくある間違い

unset($x);
echo $x;  // Notice: Undefined variable

✅ 解決策

  • unset() 後はその変数にアクセスしない。
unset($x);
if (isset($x)) {
    echo $x;
} else {
    echo '変数はunsetされました';
}

17. 定義されていないクラスやメソッドの呼び出しを避ける

❌ よくある間違い

$object = new MyClass();
$object->someMethod(); // Fatal error: Uncaught Error: Call to a member function

✅ 解決策

  • クラスが存在するかを確認してからインスタンス化する。
if (class_exists('MyClass')) {
    $object = new MyClass();
    $object->someMethod();
} else {
    echo 'クラスが存在しません';
}

18. ループでの不必要な変数再定義を避ける

❌ よくある間違い

foreach ($array as $item) {
    $sum = 0;
    $sum += $item;
}

✅ 解決策

  • ループ外で初期化して、無駄な再定義を避ける。
$sum = 0;
foreach ($array as $item) {
    $sum += $item;
}

まとめ

PHP では NoticeWarning を適切

に回避するためには、変数の初期化、型の一致、適切なエラーハンドリングが重要です。
記事で紹介した方法を実践し、安定したコードを書くために役立ててください。

Discussion