読者です 読者をやめる 読者になる 読者になる

破棄されたブログ

このブログは破棄されました。

PHP でサブクラスのインスタンスから基底クラスの静的変数を設定するメソッド呼び出した時の挙動

PHP で、基底クラスの静的変数を設定するインスタンスメソッドをサブクラスのインスタンスメソッドから呼び出したときの挙動を確認。
サブクラスから静的変数を設定した場合に、基底クラス側にも設定されるのかがわからなくなったのでコードを書いてみた。
こうやって考えてみれば当たり前なんだけど、基底クラス側にも設定される。そりゃそうだよなあ。。。

コード

<?php
/**
 * 基底クラス
 */
class Base {
        private static $static_member = null;

        /**
         * メンバ変数を設定
         * @param       mixed   var     設定するオブジェクト等
         */
        protected function setMember($var) {
                self::$static_member = $var;
        }

        /**
         * メンバ変数を取得
         * @return      mixed   設定されたオブジェクト等
         */
        public static function getMember() {
                return self::$static_member;
        }
}

/**
 * サブクラス
 */
class Extended extends Base {

        /**
         * メンバ変数を設定
         * @param       mixed   var     設定するオブジェクト等
         */
        public function setMember($var) {
                parent::setMember($var);
        }

        /**
         * メンバ変数を取得
         * @return      mixed   設定されたオブジェクト等
         */
        public static function getMember() {
                return parent::getMember();
        }
}

// プリミティブ値だと参照関係がよくわからないので StdClass を使う
$obj = new StdClass;

// サブクラスのインスタンスを生成してメンバ変数を設定
$extended = new Extended();
$extended->setMember($obj);

// 各クラスに設定されたメンバ変数を取得
$base_member     = Base::getMember();
$extended_member = Extended::getMember();

// どうなっているか確認
var_dump($base_member);
var_dump($extended_member);
var_dump($base_member === $extended_member);
?>

実行結果

object(stdClass)#1 (0) {
}
object(stdClass)#1 (0) {
}
bool(true)

広告を非表示にする