PHP static關鍵字用來定義靜態方法及屬性,在類別中可用來延遲靜態綁定以及在函數中修飾變數。
1:先來談談static在函數中的用法;
function add(){ static $a = 0; echo $a,"<br />"; $a++; }
這裡static的作用即類似C裡的static的作用,保證$a變數只有在add()第一次呼叫時才會被初始化,但要注意的是定義static變數的時候,可以不賦初值,可以給定初值,但是賦初值的時候不能使用表達式或是呼叫函數賦值,否則會報錯。
另外一點要注意的即是static變數不會儲存引用,如下:
function get_obj_ref(){ static $obj = null; echo 'Ststic obj:',"<br />"; var_dump($obj); if(is_null($obj)){ $obj = &new stdClass(); } return $obj; } $obj = get_obj_ref(); $obj2 = get_obj_ref(); function get_obj_noref(){ static $obj = null; echo 'Ststic obj:',"<br />"; var_dump($obj); if(is_null($obj)){ $obj = new stdClass(); } return $obj; } $obj = get_obj_noref(); $obj2 = get_obj_noref();
當static存儲引用時,二次呼叫函數後,變數的值並未被儲存下來,且執行上面程式會報Deprecated錯誤,即傳回引用值賦值的用法已棄。
2:static在類別中的延遲靜態綁定;
延遲靜態綁定是指允許在一個靜態繼承的上下文中引用被呼叫類別。延遲綁定的意思為:static::不再定義目前方法所在的類,而是實際執行時間所在的類別。註:它可以用於(但不限於)靜態方法的呼叫。
除了簡單的static延遲綁定的用法,還有一種轉發調用,即使用self::,parent::,static:: 以及forward_static_call( )(函數只能在方法中呼叫)將轉送呼叫訊息,如下:
class A { public static function foo() { static::who(); } public static function who() { echo CLASS."\n"; } } class B extends A { public static function test() { A::foo(); parent::foo(); self::foo(); } public static function who() { echo CLASS."\n"; } } class C extends B { public static function who() { echo CLASS."\n"; } } C::test();
這裡得到的結果是A C C,顯然在呼叫parent::foo()時,還是使用了運行時呼叫類別。
還有一點要注意的是:只有顯示宣告的static類別才是從屬與子類別的。
以下部分內容參考此部落格文章:點擊開啟連結:PHP static 繼承
<span style="font-size:18px;">class A { protected static $var1 = null; protected static $var2 = null; public static function test(){ if(!static::$var2){ static::$var2 = static::$var1; } echo get_called_class().' '.static::$var2.' '; } } class B extends A { protected static $var1 = 'b'; } class C extends A { protected static $var1 = 'c'; } B::test(); C::test(); </span>
這裡得到的結果是b b。這裡B類先呼叫過test()方法,呼叫後$var2變數已經被賦值,而C類未定義自己的$var2變量,且父類中$var2變量值已經存在,故直接使用,若在B C類中顯示定義$var2變量,則結果又會有所不同。
以上是php中關於static關鍵字的用法及注意點的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!