static關鍵字聲明一個屬性或方法是和類相關的,而不是和類的某個特定的實例相關,所以,這類屬性或方法也稱爲「類屬性」或「類方法」。static的屬性,在內存中只有一份,爲全部的實例共用的靜態屬性。php
若是訪問控制權限容許,可沒必要建立該類對象而直接使用類名加兩個冒號「::」調用,使用self:: 關鍵字訪問當前類的靜態成員。this
static 的屬性和方法,只能訪問static的屬性和方法,不能類訪問非靜態的屬性和方法。由於靜態屬性和方法被建立時,可能尚未任何這個類的實例能夠被調用。spa
。code
一個類的全部實例,共用類中的。對象
也就是說,在內存中即便有多個實例,靜態的屬性也只有一份。內存
單例模式get
<?php class Single_Service { private static $Singleton; public static function getSingleton() { if (empty ( self::$Singleton)) { if(empty(self::$Singleton)){ self::$Singleton = new Single_Service (); } } return self::$Singleton; } .... } ?>
static 後期靜態綁定io
<?php class A { public static function who() { echo __CLASS__; } public static function test() { self::who(); } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); ?>
以上代碼輸出 A ,可是若是但願輸出 Bfunction
<?php class A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // 這裏有變化,後期靜態綁定從這裏開始 } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); ?>
後期靜態綁定本想經過引入一個新的關鍵字表示運行時最初調用的類來繞過限制。簡單地說,這個關鍵字可以讓你在上述例子中調用 test() 時引用的類是 B 而不是 A。最終決定不引入新的關鍵字,而是使用已經預留的 static 關鍵字。class
class A { public static function get_self() { return new self(); } public static function get_static() { return new static(); } } class B extends A {} echo get_class(B::get_self()); // A echo get_class(B::get_static()); // B echo get_class(A::get_static()); // A
self - 就是這個類,是代碼段裏面的這個類。
static - PHP 5.3加進來的只得是當前這個類,有點像$this的意思,從堆內存中提取出來,訪問的是當前實例化的那個類,那麼 static 表明的就是那個類。