類的靜態成員變數和普通成員變數該怎樣去區別定義

SummonInHigh發表於2020-11-02

首先補充一下一些類的基本知識:
“類(Class)是物件導向程式設計(OOP,Object-Oriented Programming)實現資訊封裝的基礎。類是一種使用者定義的引用資料型別,也稱類型別。每個類包含資料說明和一組運算元據或傳遞訊息的函式。類的例項稱為物件。
類是對現實生活中一類具有共同特徵的事物的抽象。如果一個程式裡提供的資料型別與應用中的概念有直接的對應,這個程式就會更容易理解,也更容易修改。一組經過很好選擇的使用者定義的類會使程式更簡潔。此外,它還能使各種形式的程式碼分析更容易進行。特別地,它還會使編譯器有可能檢查物件的非法使用。
類的內部封裝了屬性和方法,用於操作自身的成員。類是對某種物件的定義,具有行為(behavior),它描述一個物件能夠做什麼以及做的方法(method),它們是可以對這個物件進行操作的程式和過程。它包含有關物件行為方式的資訊,包括它的名稱、屬性、方法和事件。” – 百度百科
那麼我們按照使用類的目的的優先順序總結為:實現資訊封裝、提高程式的可讀性、提高程式碼的複用性等。而類裡面的成員屬性和成員方法都是為了首先實現資訊的封裝(我理解的類的資訊封裝可以是資料的型別轉換、資訊補充、資訊拆分或聚合等一系列操作)。那麼這裡我們應該去探討的是靜態成員變數和普通成員變數在資訊封裝中所扮演的角色。
首先我們看一下靜態成員變數和普通成員變數的主要的不同:宣告類屬性或方法為靜態,就可以不例項化類而直接訪問。這意味著普通成員變數或方法會跟著例項化後的物件走,而靜態的不必。所以我能得出的結論是:
類的普通成員變數一般為該類所具有的普通屬性,當該類被例項化時該屬性才會被賦值或真正使用,屬於某一例項化物件的屬性(動態,即跟著例項化的物件走)。而類的靜態成員變數是具有成為定義該類的資料欄位或n個例項化某一普通屬性的聚合(少見),不屬於任何例項化物件的屬性(靜態,不必跟著例項化的物件走)。
以杯子為例:
杯子的普通屬性可以有:顏色、材質、容量、重量等;靜態屬性:各種杯子的合格標準。

例如:

class cup {
    // 名稱
    public $name;
    // 材質
    public $material;
    // 顏色
    public $color;
    // 容量
    public $volume;
    // 重量
    public $weight;
    // 合格標準
    public static $standard = [
        // 塑料杯
        "plastic"  => 1,
        // 玻璃杯
        "glass"    => 2,
        // 陶瓷杯
        "ceramics" => 3
    ];
    // 構造
    public function __construct($name, $material, $color = "", $volume = "", $weight = "")
    {
        $this->name     = $name;
        $this->material = $material;
        $this->color    = $color;
        $this->volume   = $volume;
        $this->weight   = $weight;
    }
}

$cup1 = new cup("cup1", "plastic");
$cup1->color = "red";
var_dump($cup1);
var_dump(cup::$standard['plastic']);

文章中如有不正確的,歡迎大佬批評指正。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章