PHP 類包含七種核心語法成員,掌握它們的定義、訪問修飾符、調用方式與繼承規則,是面向對象開發的基石。本文以 Student 類為例,系統梳理屬性、靜態屬性、方法、靜態方法、類常量、構造函數、析構函數的完整語法與訪問矩陣。
| 成員類型 | 關鍵字 | 訪問修飾符 | 屬於 | 調用方式 |
|---|---|---|---|---|
| 類常量 | const | 無 (隱含 public) | 類 | ClassName::CONST |
| 實例屬性 | public/protected/private | 三種皆可 | 對象 | $obj->prop |
| 靜態屬性 | static + 修飾符 | 三種皆可 | 類/對象 | ClassName::$prop / $obj::$prop |
| 實例方法 | function + 修飾符 | 三種皆可 | 對象 | $obj->method() |
| 靜態方法 | static function + 修飾符 | 三種皆可 | 類/對象 | ClassName::method() / $obj::method() |
| 構造函數 | __construct | 通常 public | 對象創建時自動調用 | new ClassName() |
| 析構函數 | __destruct | 通常 public | 對象銷毀時自動調用 | 自動 / unset($obj) |
<?php
class Student {
// 類常量
const STUDENT = 'Tom';
// 實例屬性
public $stu_name;
// 靜態屬性
public static $stu_num = 1;
// 實例方法
public function stuFunction() {
echo 'non_static_function<br />';
}
// 靜態方法
public static function static_stuFunction() {
echo 'static_function<br />';
}
// 構造函數
public function __construct($stu_name) {
$this->stu_name = $stu_name;
echo '__construct<br />';
}
// 析構函數
public function __destruct() {
echo '__destruct<br />';
}
}
// ========== 實例化與調用 ==========
$object = new Student('Tom'); // 輸出 __construct
// 對象調用實例屬性
echo $object->stu_name . '<br />'; // Tom
// 對象調用靜態屬性 (PHP 5.3+)
echo $object::$stu_num . '<br />'; // 1
// 類調用靜態屬性 (推薦)
echo Student::$stu_num . '<br />'; // 1
// 對象調用實例方法
$object->stuFunction(); // non_static_function
// 對象調用靜態方法
$object->static_stuFunction(); // static_function
$object::static_stuFunction(); // static_function (語法糖)
// 類調用靜態方法 (推薦)
Student::static_stuFunction(); // static_function
Student::stuFunction(); // 非靜態方法靜態調用:嚴格模式下報錯,非嚴格下 $this 為 null
// 類調用類常量
echo Student::STUDENT . '<br />'; // Tom
?>
| 調用位置 | public | protected | private |
|---|---|---|---|
| 類內部 | ✅ | ✅ | ✅ |
| 子類內部 | ✅ | ✅ | ❌ |
| 外部代碼 (實例) | ✅ | ❌ | ❌ |
| 外部代碼 (類名::靜態) | ✅ | ❌ | ❌ |
Student::stuFunction()):PHP 7 移除 E_DEPRECATED,PHP 8 拋出 Error,嚴禁使用。public;單例模式構造函數設為 private。public string $name; 增強 IDE 提示與運行時檢查。<?php
class A {
public static $name = 'A';
public static function who() { echo self::$name; } // 編譯期綁定 A
public static function whoLate() { echo static::$name; } // 運行期綁定 (晚期靜態綁定)
}
class B extends A {
public static $name = 'B';
}
A::who(); // A
B::who(); // A (self 綁定父類)
A::whoLate(); // A
B::whoLate(); // B (static 綁定調用類)
?>
掌握七大成員語法、訪問控制與靜態綁定規則,能寫出結構清晰、封裝良好、可維護的 PHP 面向對象代碼。