static 關鍵字宣告屬於類別而非實例的成員,儲存在「靜態儲存區」,所有實例共享同一份記憶體。
<?php
class Person {
public static $country = "中國";
public static function say() {
echo "我是 " . self::$country . " 人";
}
}
// 類別名稱直接存取(推薦)
echo Person::$country; // 中國
Person::say(); // 我是中國人
// 修改靜態屬性影響所有實例
Person::$country = "美國";
echo Person::$country; // 美國
?>
邏輯記憶體四區分佈:
靜態成員不屬於任何實例,故 $this 不可用於靜態方法。靜態方法僅能存取靜態屬性,使用 self:: 或 類別名::。
<?php
class Person {
public static $country = "中國";
public $name;
public function introduce() {
// 非靜態方法中存取靜態屬性
echo "{$this->name} 來自 " . self::$country;
}
}
?>
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 可修飾類別(禁止繼承)或方法(禁止覆寫),不可修飾屬性:
<?php
// 禁止被繼承
final class SecurityClass {
// 禁止被覆寫
final public function criticalMethod() {
// 核心邏輯不可變更
}
}
// 錯誤示範
// class Child extends SecurityClass {} // Fatal error
// class Child extends ParentClass { public function criticalMethod() {} } // Fatal error
?>
設計原則: 當方法實作為核心演算法、安全檢查、或框架核心流程時,使用 final 保護不變性。