| 類型 | 宣告語法 | 存取語法 | 備註 |
|---|---|---|---|
| 類別常數 | `const NAME = 'value';` | `ClassName::NAME` 或 `self::NAME` | 無 `$` 符號,不可變 |
| 靜態屬性 | `static $name = 'value';` | `ClassName::$name` 或 `self::$name` | 必須加 `$`,可變 |
| 實例屬性 | `public $name = 'value';` | `$obj->name` | 需實例化物件 |
<?php
class Test {
const CONST_VAR = 'hello world';
static $staticVar = 'hello world';
function getStaticVar() {
return self::$staticVar; // 類別內部存取
}
}
$obj = new Test();
// 正確存取
echo Test::CONST_VAR; // 輸出: hello world
echo Test::$staticVar; // 輸出: hello world
echo $obj->getStaticVar(); // 輸出: hello world
// ❌ 常見錯誤
// echo Test::staticVar; // Parse Error: 必須加 $ 符號
// echo $obj->staticVar; // Notice: 靜態屬性不應透過實例存取
// 動態類別名稱呼叫 (PHP 5.3+)
$className = 'Test';
// echo $className::$staticVar; // Fatal Error: 不支援變數動態存取靜態屬性
// 正確動態呼叫方式:透過實例方法
$obj2 = new $className();
echo $obj2->getStaticVar(); // 輸出: hello world
?>
<?php
class ParentClass {
static $name = 'Parent';
public static function who() {
echo self::$name; // 編譯期綁定 → Parent
echo static::$name; // 執行期綁定 → 子類別值
}
}
class ChildClass extends ParentClass {
static $name = 'Child';
}
ParentClass::who(); // 輸出: ParentParent
ChildClass::who(); // 輸出: ParentChild (self vs static 差異)
?>
靜態屬性隨著類別載入常駐記憶體,直到腳本結束或 `unset($class::$var)` 釋放。長期運行腳本 (如 Worker) 需注意靜態資料累積導致記憶體洩漏。