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

php靜態屬性和靜態方法

在屬性,和方法前 加 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的情況下,但嚴重不支援.邏輯上解釋不通. 物件-->訪問動態方法 可以 物件-->靜態方法 可以

下一節我們將舉例分析