MeWrite Docs

Undefined variable

PHPで未定義の変数を参照した場合に発生するエラー

概要

Undefined variable は、PHPで定義されていない変数を参照しようとした場合に発生するエラーです。PHP 8.0以降ではWarning、それ以前ではNoticeとして報告されます。

エラーメッセージ

Warning: Undefined variable $username in /var/www/html/index.php on line 10
Notice: Undefined variable: username in /var/www/html/index.php on line 10

原因

  1. 変数の初期化忘れ: 変数を使用する前に値を代入していない
  2. スコープの問題: 関数内で外部変数にアクセスしようとしている
  3. タイプミス: 変数名のスペルミス
  4. 条件分岐での未定義: if文内でのみ変数が定義されている

解決策

1. 変数を初期化する

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// ❌ 間違い
echo $username;

// ✅ 正しい
$username = '';
echo $username;

// または配列の場合
$items = [];
$items[] = 'item1';

2. isset() で存在確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// ❌ 間違い
echo $_GET['page'];

// ✅ 正しい
if (isset($_GET['page'])) {
    echo $_GET['page'];
}

// または null合体演算子(PHP 7.0+)
$page = $_GET['page'] ?? 'default';

3. 関数内でグローバル変数を使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$config = ['debug' => true];

// ❌ 間違い
function checkDebug() {
    return $config['debug']; // Undefined variable
}

// ✅ 正しい(引数で渡す)
function checkDebug(array $config) {
    return $config['debug'];
}

// または global キーワード(非推奨)
function checkDebug() {
    global $config;
    return $config['debug'];
}

4. 条件分岐での初期化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// ❌ 間違い
if ($condition) {
    $message = 'Success';
}
echo $message; // $conditionがfalseの場合undefined

// ✅ 正しい
$message = '';
if ($condition) {
    $message = 'Success';
}
echo $message;

5. クラスプロパティの初期化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// ❌ 間違い
class User {
    public function getName() {
        return $this->name; // Undefined property
    }
}

// ✅ 正しい
class User {
    private string $name = '';

    public function getName(): string {
        return $this->name;
    }
}

6. エラー報告レベルの設定(開発時)

1
2
3
4
5
6
7
8
// 開発環境で全エラーを表示
error_reporting(E_ALL);
ini_set('display_errors', '1');

// 本番環境ではログに記録
error_reporting(E_ALL);
ini_set('display_errors', '0');
ini_set('log_errors', '1');

PHP 8.0以降の変更点

PHP 8.0以降では、未定義変数へのアクセスがNoticeからWarningに昇格しました。より厳格なエラーハンドリングが推奨されます。

1
2
3
4
5
// PHP 8.0+ での推奨パターン
declare(strict_types=1);

$value = $array['key'] ?? null;
$name = $_POST['name'] ?? '';

PHP の他のエラー

最終更新: 2025-12-08