基底クラスのstaticメンバ変数を継承先のクラスで書き換えると、別クラスのインスタンスにも影響する

  • 4
    Like
  • 0
    Comment
More than 1 year has passed since last update.

基底クラスの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変数は影響を受ける。

これをstaticメソッド化したものも挙動は同様です。

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

class extClassA extends base {
}

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

extClassA::printValue();              // print "super value"

extClassB::printValue();              // print "super value"
extClassB::setValue("NEW value\n");
extClassB::printValue();              // print "NEW value"

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

より詳しいことはこちらの記事が大変参考になります。
http://qiita.com/trashtoy/items/f4e2a97765e620bb2828

参考サイト

http://www.dondari.com/%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AEstatic%E3%81%AA%E3%83%A1%E3%83%B3%E3%83%90%E5%A4%89%E6%95%B0%E3%81%AE%E6%8C%99%E5%8B%95