【6日でできるPHP入門】静的メンバ

 静的メンバ(static member)は 「クラスそのものに紐づくプロパティ/メソッド」 です。インスタンスを生成せずに利用でき、プログラム全体で 1 つだけ値を保持したいときや、ユーティリティ関数をまとめたいときに重宝します。PHP では static 修飾子とスコープ解決演算子 :: を組み合わせることで、簡潔に実装・呼び出しが可能です。

1.静的メンバの基礎

1.1. インスタンスメンバとの違い

比較項目インスタンスメンバ静的メンバ
所属インスタンスごとクラスに 1 つ
呼び出し$obj->prop / $obj->method()ClassName::$prop / ClassName::method()
代表用途個別状態の保持共有状態・ユーティリティ

1.2. 使用メリット

  • 共有データの一元管理:生成数・総売上などをクラス単位で集計
  • グローバル変数の安全版:名前空間汚染を防ぎつつどこからでもアクセス
  • インスタンス不要の処理:文字列操作や設定取得など軽量呼び出し

1.3. 注意点

  • 状態を持ちすぎると テストが難しく なる。
  • マルチスレッド環境では 競合 に留意

2.PHP での実装ポイント

2.1. 宣言と初期化

private static int $counter = 0;    // ← 宣言時に初期値

2.2. クラス外からの呼び出し

Device::getTotal();                // 静的メソッド
echo Device::$counter;             // 静的プロパティ

2.3. クラス内での参照

書き方意味
self::$prop同じクラス内の静的プロパティ

3.サンプルプログラム ― Device クラス

ファイル名: sample_static.php

<?php
class Device {
    // --- プロパティ ---
    private int $serial;                 // 個別シリアル
    private static int $total = 0;       // 全体台数(静的)

    // --- コンストラクタ ---
    public function __construct() {
        self::$total++;                  // 全体カウントを増やす
        $this->serial = self::$total;    // シリアル番号を付与
    }

    // --- インスタンスメソッド ---
    public function showSerial(): void {
        echo "  シリアル番号: {$this->serial}<br>";
    }

    // --- 静的メソッド ---
    public static function showTotal(): void {
        echo "登録デバイス数: " . self::$total . "<br>";
    }
}

// ------ 動作確認 ------
Device::showTotal();     // 0
$d1 = new Device();
$d1->showSerial();       // 1
Device::showTotal();     // 1
$d2 = new Device();
$d3 = new Device();
$d2->showSerial();       // 2
$d3->showSerial();       // 3
Device::showTotal();     // 3
?>

3.1. 実行結果

3.2. コード解説

役割詳細
4static $totalクラス全体で共有する台数カウンタ
8–10コンストラクタ生成ごとに $total を 1 増加し、その値をシリアルへコピー
15showSerial()インスタンスメンバなので $this->serial を参照
20showTotal()静的メソッド。self::$total で共有値を表示
29Device::showTotal()インスタンスなしで呼び出し可能

4.静的メンバの主な用途と注意点

4.1. 静的メンバが便利な場面

利用シーン具体例
全体で共通の設定値アプリ全体のバージョン情報など
集計やカウンタ生産数、アクセス数、利用人数など
インスタンスを生成しない操作ユーティリティ関数、設定変更など

4.2. 静的メンバ利用時の注意点

  • インスタンスごとに異なる値を保持したい場合は使わない。 静的メンバは全インスタンスで共有されるため、インスタンスごとの固有情報には向きません。
  • 多用しすぎると保守性が下がる。 静的メンバに依存しすぎると、クラスの柔軟性が失われやすくなるため、用途を限定することが重要です。

まとめ

 静的メンバは、「インスタンスを作らずに使える」「クラス全体でただ1つだけ存在する」便利な機能です。主に全体で共通の値やカウンタ管理など、インスタンス単位で管理する必要がないデータに向いています。
PHPではstatic修飾子で定義し、クラス名::やself::でアクセスします。
使い方と特徴を正しく理解し、適切な場面で活用できるようになりましょう。