《PHP技術大全·第一卷》static 細緻解讀

《PHP技術大全·第一卷》之不可翻篇的基礎再鞏固

---

### static 細緻解讀

- 靜態變量

> 知識點

1. 靜態變量必須在聲明為靜態變量時初始化,否則靜態變量將失去意義。

2. 靜態變量在聲明並初始化第一次後再次執行到 static 關鍵字的聲明並初始化的那行代碼時將不再進行聲明和初始化,也就是說靜態變量的值只會聲明和初始化一次,因為靜態變量僅在php代碼編譯時被解析生成。

> 代碼示例

```php

function counter()

{

static $count = 0;//聲明並初始化 $count 為函數內部的靜態變量

//static $count = 1+2;//這樣聲明會導致報錯,因為靜態變量不接受PHP表達式,因為靜態變量的聲明並初始化時編譯時解析出來的,而表達式需要運行時才能獲得值

//$totalScore = 1;//static聲明將失去意義,因為couter的值每次都會賦值為1

echo $count."\n";

// or do something else.

$count++;

}

counter();//output:0

counter();//output:1

counter();//output:2

class Foo{

public function stepCounter($addStep)

{

static $stepNumber = 0;//聲明並初始化 $stepNumber 為類示例方法內部的靜態變量

$stepNumber = $stepNumber+$addStep;

echo $stepNumber."\n";

}

public static function scoreCounter($addScore)

{

static $totalScore = 0;//聲明並初始化 $totalScore 為類靜態方法內部的靜態變量

$totalScore = $totalScore+$addScore;

echo $totalScore."\n";

}

}

$foo = new Foo;

$foo->stepCounter(5);//output:5

$foo->stepCounter(5);//output:10

$foo->stepCounter(5);//output:15

Foo::scoreCounter(10);//output:10

Foo::scoreCounter(10);//output:20

Foo::scoreCounter(10);//output:30

```

- 靜態延遲綁定

> 知識點

1. 靜態延遲綁定跟靜態變量以及類靜態方法等沒有任何聯繫,PHP 語言小組原本打算定義一個新的語法關鍵字來使用靜態延遲綁定,

但最後還是選擇了已有的 static 關鍵字。

2. 靜態延遲綁定中的"延遲綁定"是指 static:: 不再被解析為當前方法所在的類,而會被解析成運行時所計算出來的類。

> 代碼示例

```php

class A {

public static function who() {

echo "A";

}

public static function test() {

self::who();

static::who();

}

}

class B extends A {

public static function who() {

echo "B";

}

}

class C extends B{

public static function who() {

echo "C";

}

}

C::test();//output:AC

```

當我們刪除 C 類中的 who 方法時輸出為 AB,當我們刪除 B 類中的 who 方法時輸出為 AA,可以發現靜態延遲綁定其實是為了讓我們推導出靜態方法最先被調用的那一個。

- 最佳實踐

1. 不要用靜態變量,因為它是一種非常規語法,並且會帶來代碼的副作用。

2. 靜態延遲綁定(late static bindings)一定要好好理解一下,因為它會幫助你看懂 PHP 開源框架的源碼實現。

本文使用 markdown 格式編寫,未能保持語法高亮,如需要語法高亮,請查看git倉庫鏈接:https://gitee.com/nodestudy/phpgod/blob/master/zh/02.3.md


分享到:


相關文章: