子类覆盖父静态属性

时间:2013-03-02 13:12:05

标签: php static

告诉我,如果我错了,但我很确定这是PHP中的一个错误。

<?php

class One {

    public static $var = 'hi';
}

class Two extends One {

    public static function set($var) {
        static::$var = $var;
    }
}

Two::set('bye');

var_dump(One::$var);
// bye

当我非常确定它应该输出'hi'时,该脚本会输出'bye'。你怎么看?

想要在子类中重新声明这个。

2 个答案:

答案 0 :(得分:0)

OP编辑问题,这是他提到他不想重新声明属性之前的答案

这是因为Two$var共享One

如果您这样写,那么您将得到所需的输出

class One {

    public static $var = 'hi';
}

class Two extends One {

    public static $var = 'hi';

    public static function set($var) {
        static::$var = $var;
    }
}

Two::set('bye');

// you get hi
var_dump(One::$var);
// you get bye
var_dump(Two::$var);

答案 1 :(得分:0)

我认为这是不可能的,但是如果你不想重新声明在构造函数中重新定义它...

class One {

    public static $var = 'hi';
}

class Two extends One {

    public static $var;

    public function __construct(){
        self::$var = parent::$var;
    }

    public static function set($var) {
        self::$var = $var;
    }
}

Two::set('bye');

var_dump(One::$var);
var_dump(Two::$var);