1. ホーム 
  2. 備忘録 
  3. PHP

静的メンバ、メソッド

静的メンバ

static として宣言されたメンバ変数(プロパティ)は、インスタンス化されたオブジェクトの内外問わず ::(スコープ定義演算子) を使ってコールできる
※オブジェクト外から呼ぶ場合はアクセス修飾子が public である必要がある

class Sample
{
  public static $staticText;
  public $text;

  public function run()
  {
    // static な変数は static:: や $this:: でもアクセスできるが、必ず ->(アロー演算子) ではなく ::(スコープ定義演算子) を使うこと
    echo sprintf( '$staticText は %s です。' . PHP_EOL . '$text は %s です。', self::$staticText, $this->text );
  }
}

// クラスを生成しなくても static 変数にはアクセスできる
Sample::$staticText = 'newする前です。';
echo Sample::$staticText; // newする前です。

$class1 = new Sample();
$class2 = new Sample();
$class1->text = 'class1のテキスト';
$class2->text = 'class2のテキスト';

// インスタンス化したオブジェクトから static 変数にアクセスすることもできるが、混乱の元になるのであまりしない
$class1::$staticText = 'こちらは↓で上書きされます';
$class2::$staticText = '上書きしました';
$class1->run(); // $staticText は 上書きしました です。 $text は class1のテキスト です。
$class2->run(); // $staticText は 上書きしました です。 $text は class2のテキスト です。

// 上記よりも static 変数はクラス名+スコープ定義演算子でアクセスすることが多い
Sample::$staticText = 'Sampleのバリュー';
$class1->run(); // $staticText は Sampleのバリュー です。 $text は class1のテキスト です。
$class2->run(); // $staticText は Sampleのバリュー です。 $text は class2のテキスト です。

上の例のとおり、通常のクラス変数は class1 と class2 で別々の値を持っているが、static 変数は同じ値を持っていることがわかる

また最初のテストコードにあるとおり、クラスをインスタンス化する前から static 変数はメモリ上に存在している

例えばインスタンス毎に作る必要のないキャッシュ情報などは static 変数を用いるとメモリ的にもキャッシュヒット率的にも良くなることが多い


静的メソッド

静的(static)メソッドとは、クラスのインスタンス化をせずにアクセスできるメソッドのことである

静的メソッドの中ではクラスのメンバ変数を使用することはできないので注意すること

class Sample
{
  public static function staticFunc() {
    echo "静的メソッドです";
  }
}

Sample::staticFunc(); // 静的メソッドです

    参考文献

  1. 公式ドキュメント