[PHP] PHPのstaticフィールドは取り扱いに注意がいる

概要

PHPではstaticフィールドの取り扱いに注意がいります。

具体的には、親クラス側でstaticフィールドを用意して、子クラスで再定義せずに利用した場合、兄弟クラス全てが影響を受けます

サンプルコード

<?php

class Base {
  protected static $message;
  
  function say() {
    if(is_null(static::$message)) {
      static::$message = sprintf('Hello %s', get_class(new static()));
    }
    
    printf("%s\n", static::$message);
  }
}

class A extends Base {
  function bye() {
    static::$message = sprintf('Bye %s', get_class(new static()));
    printf("%s\n", static::$message);
  }
}

class B extends Base {
}

$a = new A();
$b = new B();

$a->say();
$a->say();
$b->say();
$b->say();
$a->bye();
$b->say();

解説

上記のコードは、何らかのデータをstaticフィールドでキャッシュするサンプルです。

このコードの場合、static::$messageはBase側で保持されるらしく、A側で編集するとB側でも影響を受けます

キャッシュ目的でstaticを使うならprivateに限り、protected staticは極力使わないようにするほうが良さそうです

免責事項

このブログは個人的なメモを兼ねたものです。

このブログを参考にした結果起こりうる如何なる事態に対しても、当方では責任を負いかねます。

予めご了承ください。