2013-03-02 140 views
2

告诉我,如果我错了,但我很确定这是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'。你怎么看?

想在子类中重新声明这一点。

回答

0

OP编辑的问题,这是之前,他提到,他不希望再声明性质

它的答案,因为Two$varOne

如果你会写这样的,那么你会得到所需要的输出

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); 
+0

我不想在子类中重新声明它。 – Nathaniel 2013-03-02 13:50:14

+0

不可能我很害怕。 – 2013-03-02 13:59:46

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); 
+0

如何不重新声明'$ var',你在两个类中声明了它? – 2013-03-02 14:34:55

+0

是的我正在重新宣布,但它不会让你每次出现(当你必须)时都改变你的var,并且因为我不明白他为什么不想重新声明。 – Guilherme 2013-03-02 14:42:31

+0

我不想重新声明,因为它是一个框架,我不能确定谁使用它会重新声明这个变量。 – Nathaniel 2013-03-02 15:35:24