2013-10-09 62 views
4

我已經查找了覆蓋此錯誤的其他問題,但無法找到適用於我的問題的案例。

基本上,我的類中的靜態方法調用一個非靜態方法,該方法返回調用另一個非靜態方法。

這引發一個致命錯誤:

Fatal error: Using $this when not in object context in class.php on line ...

我想不通爲什麼它是不行的通過$這從另一個調用非靜態類方法的非靜態類方法。 是因爲它們都是從一個靜態函數調用的,因此沒有$ this實例?

這裏是(簡化)類:

class Redis_Provision { 

    public $redis = NULL; 

    public function redis_query() 
    { 
     if(is_null($this->redis)) { 
      $this->setBackend(); <------- This throws the fatal error 
     } 
     return $this->redis; 
    } 

    public function setBackend() 
    { 
     $this->redis = new Redis(); 
     $this->redis->connect(); 
    } 

    public static function activate() 
    { 

     if(self::redis_query()->ping()) 
     { 
      // Do stuff 
     } 
    } 
} 

,我會通過調用:

$redis_provision = new Redis_Provision(); 
$redis_provision->activate(); 

回答

3

錯誤發生,因爲你所謂的靜態非靜態方法(這將有上升一個E_STRICT - 檢查你的錯誤報告),它不會停止執行,但意味着沒有對象上下文(不能使用$this)。

解決錯誤的正確方法是在activate()中實例化類,然後在對象上調用redis_query()方法,例如,

$redis_provision = new Redis_Provision(); 
if($redis_provision->redis_query()->ping()) { ... } 

這意味着redis_query()執行與上下文,所以正常工作。

此外,activate()方法是靜態的,因此您不需要在調用代碼中創建新對象。您可以直接致電Redis_Provision::activate()

+0

「因爲您已經靜態調用了非靜態方法」 - activate()被定義爲靜態? –

+0

你用'self'靜態調用'redis_query()'。 –

+0

確實調用了一個靜態方法,儘管已經使用new實例化對象將在導致錯誤的靜態上下文中執行您的代碼。 – EmmanuelG

相關問題