2011-01-09 48 views
2

與雙冒號稱其爲下課後我有一段代碼:改變方法,以靜態的PHP

class example { 
    public function say($x) { 
     if ($x > 0) { 
      echo $x; 
      $this->say($x - 1); 
     } 
     else echo "0<br>\n"; 
    } 
} 

example::say(5); 

調用它,我有:

5 
Fatal error: Using $this when not in object context in (...).php on line 5 

這究竟是爲什麼?功能「說」發生了什麼?我發現它在一個類的外部被調用過,但爲什麼類內部的PHP聲明'say'不能被'$ this->'訪問?

回答

4

錯誤消息實際上非常清晰:您不能使用$ this,因爲您從未創建過示例類的實例。如果你想靜態調用你的方法,使用此:

class example { 
    public static function say($x) { 
     if ($x > 0) { 
      echo $x; 
      self::say($x - 1); // static call 
     } 
     else { 
      echo "0<br>\n"; 
     } 
    } 
} 

example::say(5); 

或者以一種更加面向對象的方式:

class example { 
    public function say($x) { 
     if ($x > 0) { 
      echo $x; 
      $this->say($x - 1); 
     } 
     else { 
      echo "0<br>\n"; 
     } 
    } 
} 

$x = new example(); 
$x->say(5); 

可以調用靜態非靜態方法,但是你不該't(並且這隻會在該方法不使用$ this時纔有效)。這就是爲什麼PHP警告你,如果E_STRICT啓用

0

您需要使用Scope Resolution Operator(:)才能訪問類中的靜態方法。因此,變線5閱讀...

example::say($x - 1); 

(你也可以使用self:say達到同樣的效果。)

+0

或self :: say($ x - 1)l但我怎麼能這樣做非靜態,並將其稱爲靜態? – kuba 2011-01-09 21:28:22

+0

@Kuba Werlos你不能有一個靜態調用的非靜態方法 - 它會調用哪個對象實例? – 2011-01-09 21:30:25

2

使用self::say()example::say()。如果您處於對象上下文中,則應使用$this(即,您有一個使用new實例化的示例對象)。