2009-05-24 72 views
88

我有一個關於靜態函數的問題。php靜態函數

讓我們假設我有一個類

class test { 
    public function sayHi() { 
     echo 'hi'; 
    } 
} 

如果我做test::sayHi();它的工作原理沒有問題。

class test { 
    public static function sayHi() { 
     echo 'hi'; 
    } 
} 

test::sayHi();也適用。

頭等艙和二等艙之間有什麼區別?

靜態函數有什麼特別之處?

+9

從php7開始,你不能靜態調用非靜態方法 – 2016-02-15 04:47:44

回答

134

在第一類中,sayHi()實際上是一種實例方法,您將其稱爲靜態方法,因此您不會使用它,因爲sayHi()從未指向$this

靜態函數與類關聯,而不是類的實例。因此,$this在靜態上下文中不可用($this未指向任何對象)。

+19

現在,非靜態方法的靜態調用可以工作,但不建議使用。對於實例方法,請小心使用此語法! – Jet 2009-05-24 12:52:02

+1

所以這就是爲什麼他們說它是靜態函數?因爲不存在具有動態數據流和動態輸出的多個實例。只是引導我@ chaos – sun 2014-02-25 13:50:26

19

整個區別在於,你不會得到$this裏面的靜態函數。如果您嘗試使用$this,則會得到Fatal error: Using $this when not in object context

好吧,好吧,還有一個區別:E_STRICT警告是由您的第一個示例生成的。

2

簡而言之,在第二種情況下,您沒有將對象作爲$ this,因爲 靜態方法是類的函數/方法而不是對象實例。

+1

只是靜態的,你是如何定義類的功能的?沒有其他花哨的生意?所以你說如果它被稱爲「class_method」而不是「static」,它會更加語義化嗎? – ahnbizcad 2015-05-10 06:31:07

1

在嘗試使用示例(PHP 5.3.5)後,我發現在定義函數的兩種情況下,都不能使用$this運算符來處理類函數。所以我找不到它們的區別。 :(

16

簡單的,靜態的功能獨立運作,他們屬於的類別。

$,這意味着,這是這個類的一個對象,它並不適用於靜態函數。

class test { 
    public function sayHi($hi = "Hi") { 
     $this->hi = $hi; 
     return $this->hi; 
    } 
} 
class test1 { 
    public static function sayHi($hi) { 
     $hi = "Hi"; 
     return $hi; 
    } 
} 

// Test 
$mytest = new test(); 
print $mytest->sayHi('hello'); // returns 'hello' 
print test1::sayHi('hello'); // returns 'hello' 
3

由於靜態方法在沒有創建對象實例的情況下可調用,因此僞變量$ this在聲明爲靜態的方法內不可用。

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

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

像任何其他PHP靜態變量一樣,靜態屬性只能使用文字或常量初始化;表達式是不允許的。因此,雖然可以將靜態屬性初始化爲整數或數組(例如),但不能將其初始化爲其他變量,函數返回值或對象。

從PHP 5.3.0開始,可以使用變量來引用類。變量的值不能是關鍵字(例如self,parent和static)。 PHP.NET

3

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