1. 程式人生 > >7:靜態屬性和靜態方法

7:靜態屬性和靜態方法

在屬性或方法前面加 static 修飾,即可稱為靜態屬性/方法

  • 普通屬性例項化之後放在例項物件上,靜態屬性則是放在類上;
  • 可以不例項化類而直接訪問,不能通過一個類已例項化的物件訪問,直接使用類訪問:類名::$屬性名;
  • 靜態屬性只能被初始化為直接量,不能使用表示式,不能將另一個變數、函式返回值,物件作為靜態屬性的值;
  • t h i s
    ,
    使 : : this在靜態方法中不可用,使用:`類名::
    屬性名,self:: , s t a t i c : : 屬性名`,'static:: 屬性名’;
  • 靜態屬性會保留上次操作的值;
  • 一般靜態屬性用於儲存類中的公有資料;
  • 訪問父類靜態屬性使用 parent::$屬性名;
  • 靜態屬性為所有例項物件共享;

靜態屬性存放於類空間內

  • 類被宣告完畢,靜態屬性也被隨之建立
  • 類在記憶體中只有一個,因此靜態屬性也只有一個

靜態方法的特點

  • 在類中:
    • 普通方法呼叫需要物件去呼叫,需要繫結this
    • 靜態方法不屬於某一個物件,它屬於本類,呼叫不需要繫結this,所以this訪問不了靜態方法,屬性也是同理;
  • t h i s , 使 : : ( ) , s e l f : : ( ) , s t a t i c : : ( ) 調 this在靜態方法中不可用,使用:`類名::方法()`,`self::方法()`,'static::方法()',方法呼叫也是一樣,去掉 符;
  • 一個靜態方法呼叫另一個非靜態方法,則產生錯誤;靜態方法中也不能在本類中去訪問一個非靜態屬性;
  • 訪問父類靜態方法使用 parent::方法名();
  • 可以不例項化類而直接訪問,不能通過一個類已例項化的物件訪問,直接使用類訪問:類名::方法名()
  • 靜態方法呼叫本類中的非靜態方法:
class Ren{
	public static function haha(){
		//echo self::hehe();    這個方式在高版本PHP中不適用
		//高版本PHP:
		( new self() ) -> hehe();//可以正常輸出
	}

	public function hehe(){
		echo '我是非靜態方法.';
	}
}
  • 在JAVA中:動能訪靜,靜不能訪動,而PHP足夠鬆散,雖然有方法可以達到訪問的目的,但是最好不要這樣做。因為靜態的東西屬於全類,你要訪問某個普通的方法,你怎麼知道,這個普通的方法屬於那個物件的呢?所以new self() -> 屬性/方法就不難理解是什麼意思,現場建立一個例項物件,然後使用它的屬性或方法;

  • 實在理解不了,背這個也行

類---訪問---靜態屬性---可以
類---訪問---靜態方法---可以
類---訪問---普通屬性---不可以
類---訪問---普通方法---不可以

靜態方法---訪問---靜態屬性---可以
靜態方法---訪問---靜態方法---可以
靜態方法---訪問---普通屬性---不可以
靜態方法---訪問---普通方法---不可以

例項---訪問--普通屬性---可以
例項---訪問--普通方法---可以
例項---訪問--靜態方法---可以
例項---訪問--靜態屬性---不可以