2012-09-29 160 views
0

如何用非靜態方法重載靜態方法?如何用非靜態方法覆蓋靜態方法?

代碼

class Env { 
    static protected $vars = [ 
    ]; 

    static public function get_env_var($var){ 
     return self::$vars[$var]; 
    } 

    static public function set_env_var($var, $value){ 
     self::$vars[$var] = $value; 
    } 
} 

class Test extends Env { 
    private $env_vars = []; 

    public function __construct(){ 
     $this->env_vars = self::$vars; 
    } 

    public function get_env_var($var){ 
     return $this->env_vars[$var]; 
    } 

    public function set_env_var($var, $value){ 
     $this->env_vars[$var] = $value; 
    } 
} 

$Test = new Test(); 

錯誤

Cannot make static method Env::get_env_var() non static in class Test in 
+0

爲什麼你需要這樣做?他們服務於一個非常不同的目的,因此壓倒一切並不合理。 –

+2

錯誤消息說明了一切:無法使靜態方法非靜態 – JvdBerg

+0

如果要在不實例化類的情況下調用該函數,那麼這就是方法 – chokrijobs

回答

1
public static function get_env_var($var) 
+0

這不是用_non_靜態方法重寫,而是簡單重寫。 – moonwave99

2

你不能。

如果您之前將它們定義爲static,那麼您有正當理由。

0
class Parent 
{ 
    public static function start() 
    { 
     echo 'Parent::start'; 
    } 
} 

class Child extends Parent 
{ 
    public static function start() 
    { 
     parent::start(); 
     echo 'Child::start'; 
    } 
} 
2

原來的問題是如何覆蓋到非靜態的靜態方法。 您的答案不是問題的答案,因爲孩子仍然是靜態的。

你不能重寫一個非靜態的靜態方法。