class Foo {
const BAR = 'bar';
public static function getConstantValue() {
return self::BAR; // 類內部訪問
}
public function getConstant() {
return self::BAR;
}
}
// 多種訪問方式均輸出 "bar"
echo Foo::BAR; // 類名訪問
$foo = 'Foo';
echo $foo::BAR; // 變量動態訪問 (PHP 5.3+)
$obj = new Foo();
echo $obj->getConstant(); // 實例方法訪問
echo $obj->getConstantValue(); // 靜態方法訪問
echo Foo::getConstantValue();
class Bar extends Foo {
const BAR = 'foo'; // 覆蓋父類常量
public static function getMyConstant() {
return self::BAR; // 當前類常量 -> "foo"
}
public static function getParentConstant() {
return parent::BAR; // 父類常量 -> "bar"
}
}
echo Bar::getMyConstant(); // foo
echo Bar::getParentConstant(); // bar
$className = 'Foo'; echo $className::BAR; // 合法 // ⚠️ 變量值不能為關鍵字 $invalid = 'self'; // $invalid::BAR; // 錯誤:不能使用 self、parent、static 作為動態類名
| 誤區 | 正確做法 |
|---|---|
| 嘗試用 `$obj::CONST` 訪問 | 使用 `self::CONST` 或 `ClassName::CONST` |
| 在介面中定義非常量 | 介面只能定義常量,不能有屬性 |
| 常量值使用變量 | PHP 5.6+ 可用常量表達式:`const B = A + 1;` |
類常量提供了類級別的不可變值儲存,配合晚期靜態綁定(`static::`)可實現多態常量行為。合理使用能提高代碼可讀性與維護性。