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的情況下,但嚴重不支持.邏輯上解釋不通.

對象-->訪問動態方法  可以
對象-->靜態方法     可以

下一節我們將舉例分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章