PHP static:靜態方法和屬性

2020-07-16 10:05:22
在 PHP 中,通過 static 關鍵字修飾的成員屬性和成員方法被稱為靜態屬性和靜態方法,這裡可以將它們統稱為靜態成員,類中的靜態成員與類中的一般成員不同,靜態成員不會被範例化到物件中,也就是說我們不需要範例化一個類,就可以通過類來存取靜態成員。

在類中宣告靜態變數很容易,我們可以在類的普通成員前加一個 static 關鍵字,就可以將這個普通成員變成靜態成員了。這樣一來,我們可以在不範例化類的情況下,直接存取類中的這些靜態成員。存取靜態成員的語法格式如下:

類名::$靜態屬性
類名::靜態方法()

其中::符號被稱為範圍解析操作符,用於存取靜態成員、靜態方法和常數,還可以用於覆蓋類中的成員和方法。

如果要在類內部的成員方法中存取靜態屬性,只要在靜態屬性的名稱前加上操作符self::即可。

下面通過一個簡單的範例演示一下靜態成員的定義:
<?php
    class Website{
        static public $name = 'C語言中文網<br>';
        public $title = 'PHP教學';
        public static function url(){
            echo self::$name;
            echo 'http://c.biancheng.net/php/<br>';
            echo $this -> title;
        }
    }

    Website::url();
?>
執行結果如下:

C語言中文網
http://c.biancheng.net/php/
Fatal error: Uncaught Error: Using $this when not in object context ……

注意:在靜態方法中,只能呼叫靜態變數,不能呼叫普通變數;而普通方法則可以呼叫靜態變數。

使用靜態成員,除了可以不需要範例化物件外,另一個作用就是在物件被銷毀後,仍然儲存被修改的靜態資料,以便下次繼續使用,這一點和我們前面介紹的靜態變數相似。

【範例】宣告一個靜態變數 $num,然後宣告一個方法,在方法的內部呼叫靜態變數並給變數的值加 1;然後,範例化類中的物件,最後,呼叫類中的方法。
<?php
    class Website{
        static public $num = 0;
        public function add(){
            echo '$num 的值為:'.self::$num;
            self::$num++;
        }
    }

    $num1 = new Website();
    $num1 -> add();
    echo '<br>';
    $num2 = new Website();
    $num2 -> add();
?>
執行結果如下:

$num 的值為:0
$num 的值為:1

靜態成員不用範例化物件,當類第一次被載入時就已經分配了記憶體空間,所以直接呼叫靜態成員的速度要更快一些。但如果靜態成員宣告得過多,空間一直被占用,反而影響系統的執行速度。