1. 程式人生 > >PHP實戰技巧(11)PHP中的靜態知識:靜態類屬性、方法

PHP實戰技巧(11)PHP中的靜態知識:靜態類屬性、方法

evel 變量 結果 其他 lan line 並且 功能 lin

前言

靜態變量用的不多,但是靜態的類屬性、類方法,則是工作中必不可少的一個知識點。

基礎語法

先看代碼,下面逐一進行解釋。

“::” 是什麽?

它是兩組冒號,調用靜態資源專屬語法,基本功能接近 ->。

定義靜態方法、屬性

在屬性、方法前加 static 關鍵字,就可以將其定義為靜態。

調用靜態屬性

必須通過 類::$屬性名 的形式,不能使用 $this->屬性名。

調用靜態方法

可以通過 類::方法名() 的形式,也可以通過 $this->方法名() 的形式。

關於 $this 偽變量

因為靜態調用沒有 new 類() 的過程,所以

this調16self::this 不存在,調用就報錯(參考代碼16行)需改為 self::this調16self::屬性(參考11行)

實戰意義

不用 new,用起來省事,這是表面上最容易看到的優點。

除此之外,看一個例子

下面的代碼,執行結果是什麽?

會報錯!因為 $x 是局部變量,離開函數後就銷毀了。

看另一個例子

執行後會怎樣?(SoDevel 這個類來自第一段代碼)

不會報錯,可以正常使用。

為什麽會這樣?

普通局部變量,一旦函數執行完畢就銷毀,但是靜態變量不會。

靜態類屬性就更牛了,不光不會銷毀,還可以被其他局部環境所調用。(靜態變量雖然沒有銷毀,但是只能在定義它的函數內使用)

這樣有什麽意義?

意義大了。

在面向對象編程中,我們主要代碼都在局部環境(也就是類方法裏),而在方法中定義的變量,都是局部變量。就算使用 $this->var 定義成類屬性,也只能在類的內部使用。

而 靜態類屬性 可以無視所有規則,在任何地方都能隨時進行賦值、讀取操作。

你用過MVC結構的框架嗎?

在控制器裏定義變量,都需要用 $this->assign() 或者類似的語法,傳遞給模板。

如果使用靜態類屬性,就可以免去這個過程,模板拿來即用。

那為什麽框架不這樣做?

因為某些特定情況不好處理,並且會導致性能下降(靜態資源直到程序執行完畢才釋放)

轉載出處:http://www.iis7.com/c/90/

PHP實戰技巧(11)PHP中的靜態知識:靜態類屬性、方法