スーパークラスのstaticなメンバ変数の挙動

基底クラスのstaticメンバ変数を変更すると、すべての継承クラスに影響してしまいます。 特性を把握して使用しないと思わぬところでハマりそうです。

ソース

<?php
class base {
  protected static $super_value = "super value\n";
  public function printValue() {
    echo self::$super_value;
  }
}

class extClassA extends base {
}

class extClassB extends base {
  public function setValue($value) {
    self::$super_value = $value;
  }
}

$obj_a = new extClassA();
$obj_a->printValue();              // print "super value"

$obj_b = new extClassB();
$obj_b->printValue();              // print "super value"
$obj_b->setValue("NEW value\n");
$obj_b->printValue();              // print "NEW value"

$obj_a->printValue();              // print "NEW value" ...先にインスタンス化されていてもstatic変数は影響を受ける。

facebook slideshare rubygems github qiita