php靜態屬性和靜態方法
阿新 • • 發佈:2019-02-06
在屬性,和方法前 加 static 修飾,這種稱為靜態屬性/ 靜態方法
靜態屬性
class Human {
static public $head = 1;
public function changeHead() {
Human::$head = 9;
}
public function getHead() {
return Human::$head;
}
}
// 現在沒有物件,想訪問靜態的$head屬性
/*
普通屬性包在物件內,用物件->屬性名 來訪問
靜態屬性放在類內的,
靜態屬性既然存放於類空間內
1:類宣告完畢,該屬性就已存在,不需要依賴於物件而訪問
2:類在記憶體中只有一個,因此靜態屬性也只有一個
*/
// 當一個物件都沒有,靜態屬性也已隨類宣告而存在
echo Human::$head,'<br />'; // 1
// 靜態屬性只有一個,為所有的物件的共享.
$m1 = new Human();
$m1->changeHead(); // 某個人改變了人類的頭的數量
$m2 = new Human();
$m3 = new Human();
echo $m2->getHead(),'<br />'; // 9
echo $m3->getHead(),'<br />'; // 9
靜態方法
static public/protected/private function t() {
}
普通方法,存放於類內的,只有1份
靜態方法,也是存放於類內的,只有1份
區別在於: 普通方法需要物件去調動, 需要繫結$this
即,普通方法,必須要有物件,用物件調動
而靜態方法, 不屬性哪個物件,屬於類,因此不需要去繫結$this,
即, 靜態方法,通過類名就可以調動
class Human {
public $name = '張三';
static public function cry() {
echo '5555';
}
public function eat() {
echo '吃飯';
}
public function intro() {
echo $this->name;
}
}
// 此時一個物件都沒有
Human::cry(); //55555
/*
下面這個eat方法是一個非靜態方法,應由物件來呼叫
但是呢,呼叫了,也沒出問題
*/
Human::eat(); //吃飯
/*
接上,但從邏輯來理解, 如果用類名靜態呼叫非靜態方法
比如 intro()
那麼: $this 到底是指哪個物件???
因此,直接報錯
Fatal error: Using $this when not in object context in D:\www\1109\08.php on line 45
*/
Human::intro(); //error
/*
如上分析,其實非靜態方法,是不能由類名靜態呼叫的.
但是! PHP中的面向物件檢測的並不嚴格,
只要該方法沒有$this,就會轉化靜態方法來呼叫.
因此,cry()可以呼叫.
但是,在PHP5.3的strict級別下,或者PHP5.4的預設級別
都已經對類名::非靜態方法做了提示
則會提示:Strict Standards: Non-static method Human::eat() should not be called statically
不能靜態的去呼叫非靜態方法
*/
Error_reporting(E_ALL|E_STRICT);
Human::eat();
// 動訪問靜
$lisi = new Human();
$lisi->cry(); // 5555
/*
類->訪問->靜態方法 可以
類->動態方法 方法內沒有this的情況下,但嚴重不支援.邏輯上解釋不通.
物件-->訪問動態方法 可以
物件-->靜態方法 可以
下一節我們將舉例分析