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

PHP 類關鍵字深度解析:$this、static、final、const、self

     編輯:PHP 相關知識

PHP 面向對象編程中,$this、static、final、const、self 五大關鍵字構成類機制的核心。本文通過代碼示例系統闡述各關鍵字的語法、語義與最佳實踐。

$this - 當前實例引用

僅在對象上下文中可用,訪問非靜態屬性/方法。

<?php
class MyClass {
    private $name;
    
    public function __construct($name) {
        $this->name = $name; // 訪問實例屬性
    }
    
    public function getName() {
        return $this->name;
    }
    
    public function printName() {
        echo $this->getName(); // 調用實例方法
    }
}

$obj = new MyClass("PHP 關鍵字");
$obj->printName(); // 輸出:PHP 關鍵字
?>

三種內部訪問方式對比

關鍵字指向訪問範圍
$this當前實例非靜態屬性/方法
self當前類靜態屬性/方法/常量
parent父類父類靜態/非靜態成員

static - 靜態綁定

靜態變量(函數作用域)

function counter() {
    static $count = 0; // 僅初始化一次
    $count++;
    echo $count;
}
counter(); // 1
counter(); // 2

特性:函數調用間保持值,不污染全局命名空間。

靜態成員(類作用域)

<?php
class MyObject {
    public static $myStaticVar = 0;
    
    function myMethod() {
        self::$myStaticVar += 2;
        echo self::$myStaticVar;
    }
}

$obj1 = new MyObject();
$obj1->myMethod(); // 2
$obj2 = new MyObject();
$obj2->myMethod(); // 4 (共享同一靜態變量)
?>

靜態計數器示例

<?php
class Book {
    static $num = 0;
    
    public function showMe() {
        echo "您是第 " . self::$num . " 位訪客";
        self::$num++;
    }
}

$book1 = new Book();
$book1->showMe(); // 您是第 0 位訪客
$book2 = new Book();
$book2->showMe(); // 您是第 1 位訪客
echo "您是第 " . Book::$num . " 位訪客"; // 您是第 2 位訪客
?>

重要規則

  • 靜態方法只能訪問靜態成員(屬性/方法)
  • 靜態方法中 不可使用 $this
  • 類外訪問:ClassName::$staticProperty、ClassName::staticMethod()

final - 禁止繼承/重寫

  • final class:類不可被繼承
  • final function:方法不可被重寫
<?php
final class BaseClass {
    public function test() {
        echo "BaseClass::test()";
    }
    
    final public function moreTesting() {
        echo "BaseClass::moreTesting()";
    }
}

// class ChildClass extends BaseClass { // Fatal error: Cannot inherit from final class
// }

// 方法級 final
class AnotherBase {
    final public function locked() {}
}

class Child extends AnotherBase {
    // public function locked() {} // Fatal error: Cannot override final method
}
?>

const - 類常量

  • 聲明格式:const CONST_NAME = value;(無 $ 符號)
  • 訪問:self::CONST_NAME 或 ClassName::CONST_NAME
  • 不可在聲明中使用表達式/變量/函數調用
<?php
class ClassA {
    private static $name = "static";
    const PI = 3.14;
    public $value = "instance";
    
    public static function getName() {
        return self::$name; // 靜態屬性用 self::
    }
    
    // 錯誤:靜態方法不可訪問非靜態屬性
    // public static function getValue() { return self::$value; }
    
    public function getPI() {
        return self::PI; // 常量用 self::
    }
}
?>

self - 當前類引用

  • 用於訪問靜態成員、常量、靜態方法
  • 編譯期綁定(非晚期靜態綁定),繼承場景需注意
<?php
class ParentClass {
    const NAME = 'Parent';
    public static function who() {
        echo self::NAME; // 輸出 Parent
    }
}

class ChildClass extends ParentClass {
    const NAME = 'Child';
    public static function test() {
        self::who(); // 輸出 Parent (self 綁定到定義類)
    }
}

ChildClass::test(); // 輸出 Parent
?>

晚期靜態綁定:PHP 5.3+ 使用 static:: 替代 self:: 可解決繼承場景綁定問題。

最佳實踐總結

  1. $this:實例化後操作對象狀態
  2. static:共享類級狀態、無狀態工具方法
  3. final:封鎖核心邏輯防止被意外修改
  4. const:定義類級不可變常量
  5. self:類內部訪問靜態/常量成員

清晰區分五者語義,能寫出更健壯、可維護的 OOP 代碼。

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