3.

PHP 変数完全ガイド (スコープ/参照/型変換)

編集
この記事の要点
  • PHP の変数は $ 接頭辞が必須$name$Name は別変数 (case sensitive)
  • 命名規則: 英数字と _。先頭は文字 or _ (数字不可)。PSR-12 は camelCase 推奨
  • 型は実行時に決まる (動的型付け) が、PHP 7.4+ の Typed Properties でクラスフィールドに型宣言可能
  • 参照 &$var はエイリアス。値渡しがデフォルトだが、明示すれば参照渡しに
  • 関数内で外部変数を使うには global $x;$GLOBALS["x"]。static で関数呼び出しをまたいで値保持

変数の基本

// 宣言と代入が同時 (var キーワード等は不要)
$name = '太郎';
$age  = 30;
$flag = true;
$arr  = [1, 2, 3];

// 大文字小文字を区別
$name = '太郎';
$Name = '次郎';        // 別変数
echo $name;            // 太郎
echo $Name;            // 次郎

// 命名規則
$valid    = 1;
$_valid   = 1;
$valid_1  = 1;
$1invalid = 1;         // ❌ Parse error
$invalid- = 1;         // ❌ Parse error (ハイフン不可)

// 日本語変数も使えるが PSR-12 非推奨
$名前 = '太郎';        // 動くが避ける

PSR-12 命名規則

対象規則
変数camelCase$userName
定数UPPER_SNAKE_CASEconst MAX_RETRY = 3;
クラス名PascalCaseclass UserService
メソッド名camelCasepublic function getName()
プロパティcamelCasepublic string $userName;
ファイル名クラスと同じ (PSR-4)UserService.php

スコープ: グローバル / ローカル / static

$g = 10;

function f1() {
    echo $g ?? 'undefined';   // undefined: 関数内からは見えない
}

function f2() {
    global $g;                // ★ global 宣言で参照
    echo $g;                  // 10
}

function f3() {
    echo $GLOBALS['g'];       // ★ スーパーグローバル経由
}

// static 変数 (関数呼び出しをまたいで保持)
function counter() {
    static $count = 0;
    $count++;
    return $count;
}
echo counter(); // 1
echo counter(); // 2
echo counter(); // 3

参照渡し (&)

// 値渡し (デフォルト)
$a = 10;
$b = $a;        // コピー
$b = 20;
echo $a;        // 10 (影響なし)

// 参照渡し
$a = 10;
$b = &$a;       // ★ エイリアス
$b = 20;
echo $a;        // 20 (連動)

// 関数引数
function modify(&$x) {
    $x *= 2;
}
$n = 5;
modify($n);     // n が直接書き換わる
echo $n;        // 10

// foreach での参照
$arr = [1, 2, 3];
foreach ($arr as &$v) {
    $v *= 10;
}
unset($v);      // ★ 参照は明示的に解放推奨
print_r($arr);  // [10, 20, 30]

foreach 参照の罠: ループ後の $v は最後の要素への参照が残り、後続の代入で配列が壊れます。必ず unset($v) しましょう。

可変変数 ($$var)

$name = 'hoge';
$$name = 'value';      // ★ $hoge = 'value' と同じ
echo $hoge;            // value

// 動的にプロパティアクセス
$obj = new stdClass();
$prop = 'foo';
$obj->$prop = 1;       // $obj->foo = 1
echo $obj->foo;        // 1

// ループでの利用 (非推奨パターン)
foreach (['name' => '太郎', 'age' => 30] as $k => $v) {
    $$k = $v;          // ❌ コードリーディング困難に
}
echo $name;            // 太郎
echo $age;             // 30

可変変数は基本的に避けるのが PSR-12 / PHPStan の推奨。連想配列 ($data['name']) で代替できます。

型: 動的型付けと Type Juggling

$x = '10';     // string
$x = 10;       // int (再代入で型変更 OK)
$x = 10.5;     // float
$x = true;     // bool
$x = null;     // null
$x = [1,2,3];  // array
$x = new stdClass(); // object

// 緩い比較 (Type Juggling)
'0'    == false;  // true ❌ 罠
'10abc' == 10;     // PHP 7: true, PHP 8: false (仕様変更)
[]     == null;   // false (false != null)
0      == 'foo';  // PHP 7: true ❌ 罠, PHP 8: false

// ★ 厳密比較 === を使うのが鉄則
'10' === 10;      // false
0    === false;   // false

PHP 7.4+ Typed Properties

class User {
    public int    $id;
    public string $name;
    public ?string $email = null;     // nullable
    public array  $roles = [];
    public readonly string $createdAt;  // ★ PHP 8.1 readonly

    // コンストラクタプロモーション (PHP 8.0)
    public function __construct(
        public string $username,
        public int $age = 0,
    ) {
        $this->createdAt = date('c');
    }
}

$u = new User('taro', 25);
$u->name = 123;            // ❌ TypeError (int を string に代入)
$u->createdAt = '...';      // ❌ Error (readonly)

Null Coalescing (??) と unset

// Null Coalescing (PHP 7+)
$name = $input['name'] ?? 'default';
// = isset($input['name']) ? $input['name'] : 'default'

// Null Coalescing Assignment (PHP 7.4+)
$config['timeout'] ??= 30;

// 変数の破棄
$x = 10;
unset($x);
echo $x ?? 'gone';   // gone

// 配列要素の削除
$arr = ['a' => 1, 'b' => 2];
unset($arr['a']);
print_r($arr);       // ['b' => 2]

変数のスコープまとめ

場所スコープ備考
関数外ファイルスコープ (グローバル)require/include したファイル間でも共有
関数内ローカルglobal 宣言で外を参照
クラス内 ($this->)インスタンスオブジェクト単位
クラス内 (self::$x)クラスstatic
クロージャ (function () use ($x))キャプチャ明示的に取り込み
アロー関数 (fn() => $x)自動キャプチャPHP 7.4+

FAQ

Q: $x = nullunset($x) の違いは?
A: 前者は変数が存在し値が null。後者は変数自体が消える。isset($x) の結果が異なります。

Q: 変数の型を調べたい
A: var_dump($x) / gettype($x) / is_int() 等の is_* 関数。デバッガなら xdebug。

Q: $_POST$_SESSION は何?
A: スーパーグローバル変数。どこからでも見える特別な配列で global 宣言不要。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 基本的なルール
  2. データ型
  3. 変数
  4. 定数
  5. 配列
  6. コレクション(List,Set,Queue)
  7. Map(連想配列)
  8. 演算子
  9. 条件分岐
  10. 繰り返し制御文
  11. クラス
  12. メソッド
  13. インスタンス化
  14. コンストラクタ
  15. staticキーワード
  16. オーバーロード
  17. 継承
  18. オーバーライド
  19. this
  20. super
  21. パッケージ
  22. アクセス修飾子
  23. 抽象クラス・メソッド
  24. インターフェース
  25. カプセル化
  26. データベース接続
  27. セッション
  28. ファイル入出力
  29. ラムダ式

最近更新/作成されたページ