首頁  >  文章  >  後端開發  >  php中關於static關鍵字的用法及注意點的詳解

php中關於static關鍵字的用法及注意點的詳解

黄舟
黄舟原創
2017-07-02 11:56:141300瀏覽

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 &#39;Ststic obj:&#39;,"<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 &#39;Ststic obj:&#39;,"<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().&#39; &#39;.static::$var2.&#39;
&#39;; 
  } 
} 
class B extends A { 
  protected static $var1 = &#39;b&#39;;   
} 
class C extends A { 
  protected static $var1 = &#39;c&#39;;   
} 
B::test(); 
C::test(); </span>

這裡得到的結果是b b。這裡B類先呼叫過test()方法,呼叫後$var2變數已經被賦值,而C類未定義自己的$var2變量,且父類中$var2變量值已經存在,故直接使用,若在B C類中顯示定義$var2變量,則結果又會有所不同。



#

以上是php中關於static關鍵字的用法及注意點的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn