概要
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は極力使わないようにするほうが良さそうです。