首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP static、const、final 關鍵字深度解析與記憶體模型

     編輯:PHP 相關知識

static 靜態成員:共享資料與記憶體優化

static 關鍵字宣告屬於類別而非實例的成員,儲存在「靜態儲存區」,所有實例共享同一份記憶體。

靜態屬性與方法實戰

<?php
class Person {
    public static $country = "中國";
    
    public static function say() {
        echo "我是 " . self::$country . " 人";
    }
}

// 類別名稱直接存取(推薦)
echo Person::$country;  // 中國
Person::say();          // 我是中國人

// 修改靜態屬性影響所有實例
Person::$country = "美國";
echo Person::$country;  // 美國
?>

記憶體模型解析

邏輯記憶體四區分佈:

  • 堆疊:儲存物件參考(引用)
  • 堆積:儲存物件實例資料
  • 靜態區:儲存 static 成員(類別載入時配置)
  • 程式碼區:儲存方法指令

靜態成員不屬於任何實例,故 $this 不可用於靜態方法。靜態方法僅能存取靜態屬性,使用 self:: 或 類別名::。

static 進階:非靜態方法存取靜態成員

<?php
class Person {
    public static $country = "中國";
    public $name;
    
    public function introduce() {
        // 非靜態方法中存取靜態屬性
        echo "{$this->name} 來自 " . self::$country;
    }
}
?>

const 類別常數:不可變的編譯期常值

const 定義類別層級常數,無 $ 符號,預設 public:

<?php
class MyClass {
    const VERSION = '1.0.0';
    
    public function show() {
        echo self::VERSION;  // 類別內部使用 self::
    }
}

echo MyClass::VERSION;  // 1.0.0
$obj = new MyClass();
$obj->show();
// echo $obj::VERSION;  // 錯誤:不支援物件存取常數(PHP 5.3+ 支援但不推薦)
?>

const vs define(): const 為編譯期常數,效能較好;define() 為執行期常數,支援條件式定義。

final 關鍵字:防止繼承與覆寫

final 可修飾類別(禁止繼承)或方法(禁止覆寫),不可修飾屬性:

<?php
// 禁止被繼承
final class SecurityClass {
    // 禁止被覆寫
    final public function criticalMethod() {
        // 核心邏輯不可變更
    }
}

// 錯誤示範
// class Child extends SecurityClass {}  // Fatal error
// class Child extends ParentClass { public function criticalMethod() {} }  // Fatal error
?>

設計原則: 當方法實作為核心演算法、安全檢查、或框架核心流程時,使用 final 保護不變性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved