2015-05-25 28 views
1

在提供的類中,我需要從靜態和內部對象中調用函數。但我不能這樣做。我的類代碼檢查對象上下文中的天氣還是不在PHP中

class mc { 

    public $trace_back = 1; 

    public static function pre() { 
     if(isset($this) && isset($this->trace_back)){ 
      $trace_back = $this->trace_back; 
     } 
     else{ 
      $trace_back = 1; 
     } 
     echo $trace_back; 
    } 

} 

現在,當我打電話靜態

mc::pre(); // echo 1; 

呼應,預期這是罰款。
但是當對象上下文,像

function mcpre(){ 
    $mc = new mc(); 
    $mc->trace_back = 3; 
    $mc->pre(); // echo 1 
} 

它再次呼應1,3時預期。

從更廣泛的角度來看,我的問題是我們如何以靜態和對象兩種方式調用函數。

這也行不通。

class Foo { 
    function bar() { 
    $static = !(isset($this) && get_class($this) == __CLASS__); 
    } 
} 
+0

簡答:你不需要。爲了你自己。 – Alfwed

+0

爲什麼echo語句在外部函數中總是會打印1 –

+0

哦,那只是輸入錯誤,我編輯了這個問題。 – anwerj

回答

2

一類的靜態方法不訪問任何非靜態成員,包括$this;如果您想以任何靜態方法訪問$trace_back,則需要將其聲明爲靜態。

<?php 
class mc { 
    public static $trace_back = 1; 
    public static function pre() { 
     echo self::$trace_back . "<br />"; 
    } 
} 

mc::pre(); // echoes 1 
mc::$trace_back = 2; 
mc::pre(); // echoes 2 
?> 

你會發現this非常有用。

由於靜態方法是沒有創建對象 的實例可調用,僞變量$this不可聲明爲靜態的方法 內部。

無法通過對象使用 箭頭運算符->訪問靜態屬性。

調用非靜態方法靜態生成E_STRICT級別 警告。

+0

你!知道這不應該那麼簡單。謝啦! – anwerj

0

改變你的函數從在函數返回值:

public static function pre() { 
    if(isset($this) && isset($this->trace_back)){ 
     $trace_back = $this->trace_back; 
    } 
    else{ 
     $trace_back = 1; 
    } 
    return $trace_back; 
} 
+2

它肯定會拋出** $ this **的錯誤,而不是在對象上下文中。 – anwerj

+0

錯字...感謝您的糾正:) –

相關問題