作用域解析操作符,簡稱 Paamayim Nekudotayim(希伯來語「雙冒號」),用於訪問:
const)static)static)parent::)self::)static::,PHP 5.3+)
class Fruit {
const CONST_VALUE = 'Fruit Color';
}
echo Fruit::CONST_VALUE; // Fruit Color
// PHP 5.3+ 支持變量類名
$classname = 'Fruit';
echo $classname::CONST_VALUE; // Fruit Color
class Fruit {
protected function showColor() { echo "Fruit::showColor()\n"; }
}
class Apple extends Fruit {
public static $color = 'Red';
public function showColor() {
parent::showColor(); // 調用父類方法
echo "Apple::showColor()\n";
}
public static function doubleColon() {
echo parent::CONST_VALUE . "\n"; // 訪問父類常量
echo self::$color . "\n"; // 訪問當前類靜態屬性
}
}
$apple = new Apple();
$apple->showColor();
// 輸出:
// Fruit::showColor()
// Apple::showColor()
Apple::doubleColon();
// 輸出:
// Fruit Color
// Red
class Apple {
public function showColor() { return $this->color; }
}
class Banana {
public $color = 'Banana is yellow';
public function GetColor() { return Apple::showColor(); }
}
$banana = new Banana;
echo $banana->GetColor(); // Banana is yellow
關鍵點: 靜態調用 Apple::showColor() 時,$this 保持調用者上下文($banana 實例),故訪問到 Banana 的 $color。這是 PHP 獨特的「靜態調用非靜態方法」行為(已棄用,PHP 8+ 嚴格禁止)。
class Fruit {
static function color() { return "color"; }
static function showColor() { echo "show " . self::color(); }
}
class Apple extends Fruit {
static function color() { return "red"; }
}
Apple::showColor(); // 輸出 "show color" 而非 "show red"
self:: 在定義時綁定(早期綁定),指向聲明該方法的類。若需多態行為,請使用 static::(晚期靜態綁定,PHP 5.3+)。
trait Logger {
public static function log($msg) { echo "[LOG] $msg\n"; }
}
class Service {
use Logger;
}
Service::log('Started'); // [LOG] Started
| 錯誤代碼 | 問題 | 修正 |
|---|---|---|
| $obj::method() | 實例調用靜態方法(語法合法但語義混淆) | $obj->method() 或 Class::method() |
| Class::$prop = val | 靜態屬性需先聲明 | class Class { public static $prop; } |
| self::method() 在子類中 | 早期綁定導致無法多態 | 改用 static::method() |
| parent:: 訪問私有成員 | private 不可繼承訪問 | 改為 protected |
雙冒號是 PHP 面向對象靜態特性的核心語法。掌握 self::(早期綁定)、parent::(父類委託)、static::(晚期綁定)的區別,以及 $this 在靜態調用非靜態方法時的上下文保持行為,對於編寫正確、可維護的 OOP 代碼至關重要。