PHP中的static關鍵字,在類中的用法
很容易相當可以聲明類屬性或者類方法爲靜態,靜態屬性和方法嗾使屬於類的,靜態屬性不能通過對象訪問,但靜態方法可以通過對象訪問。
PHP中函數體中的用法
php中static變量只存在於本地函數中,但程序執行完本函數之後,static變量還會一直保存,也即是 數執行$a 該變量只會被實例化一次。
function test()
{
$a = 0;
echo $a . "\n";
$a++;
}
// 都會輸出0
for ($i=0; $i<5; $i++) {
test();
}
//result :0 0 0 0 0
function test()
{
static $a = 0;
echo $a . "\n";
$a++;
}
// 都會輸出0
for ($i=0; $i<5; $i++) {
test();
}
//result :0 1 2 3 4
將變量a聲明爲static後,每次函數執行$a 只會被實例化一次。
因此 :在遞歸函數中,用static可以作爲函數運行計數器來使用。
延遲靜態綁定
class A{
static $name = "Tom";
public function printName(){
echo self::$name."\n";
self::fun();
}
static function fun(){
echo "A Class\n";
}
}
class B extends A{
static $name = "Jon";
static function fun(){
echo "B Class\n";
}
}
$obj = new B();
$obj->printName();
// 輸出結果
// Tom
// A Class
在printName函數裏面使用了self關鍵字,self是指向當前類的"指針",
是這樣的,在定義A類的是時候,在函數printName裏面使用self關鍵字調用了靜態方法或屬性,
但是這個函數一旦定義好,A類的靜態方法和屬性就被綁定到函數了,不要去追究爲什麼,php就是這麼實現的,
但是我們現在要實現這樣的效果,就是函數定義好后里面使用到的靜態方法和屬性不要立即綁定死,
而是根據最終繼承的類來確定綁定。
所以php在5.5以後使用了static關鍵字來解決這個問題,解決後的代碼例子如下:
class A{
static $name = "Tom";
public function printName(){
echo static::$name."\n";
static::fun();
}
static function fun(){
echo "A Class\n";
}
}
class B extends A{
static $name = "Jon";
static function fun(){
echo "B Class\n";
}
}
$obj = new B();
$obj->printName();
// 輸出結果
// Join
// B Class
延遲了綁定的類,就實現了需要延遲靜態綁定。
參考:
https://www.jianshu.com/p/ab5749914f7c
https://www.cnblogs.com/codeAB/p/5560631.html