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

PHP 雙冒號 (::) 作用域解析操作符完整指南

     編輯:PHP 相關知識

概念定義

作用域解析操作符,簡稱 Paamayim Nekudotayim(希伯來語「雙冒號」),用於訪問:

  • 類常量(const)
  • 靜態屬性(static)
  • 靜態方法(static)
  • 父類被覆蓋的成員(parent::)
  • 當前類成員(self::)
  • 晚期靜態綁定(static::,PHP 5.3+)

核心用法場景

1. 類外部通過類名訪問靜態成員

class Fruit {
    const CONST_VALUE = 'Fruit Color';
}

echo Fruit::CONST_VALUE;  // Fruit Color

// PHP 5.3+ 支持變量類名
$classname = 'Fruit';
echo $classname::CONST_VALUE;  // Fruit Color

2. 繼承體系中的 parent:: 與 self::

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

3. 靜態方法的非實例化調用與 $this 行為

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+ 嚴格禁止)。

4. self:: 與靜態綁定的區別

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 與介面中的 ::

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 代碼至關重要。

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