PHP 面向對象編程中,$this、static、final、const、self 五大關鍵字構成類機制的核心。本文通過代碼示例系統闡述各關鍵字的語法、語義與最佳實踐。
僅在對象上下文中可用,訪問非靜態屬性/方法。
<?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 | 父類 | 父類靜態/非靜態成員 |
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 位訪客
?>
ClassName::$staticProperty、ClassName::staticMethod()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_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::
}
}
?>
<?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:: 可解決繼承場景綁定問題。
清晰區分五者語義,能寫出更健壯、可維護的 OOP 代碼。