前言
PHP 5 類定義語法包含屬性、方法、常數、存取控制、靜態成員與型別提示。本節系統整理類結構組成、屬性聲明細節、方法定義規則、Type Hint 機制與實戰範例。
1. 類基本結構
class ClassName extends ParentClass {
// 屬性聲明
public $publicProp;
private $privateProp;
protected $protectedProp;
static $staticProp;
// 常數
const CLASS_CONST = 'value';
// 方法聲明
public function methodName(TypeHint $param) { ... }
static function staticMethod() { ... }
}
大括號內**僅能聲明屬性、方法、常數**,不可執行任意代碼。
2. 屬性聲明細節
| 特性 | 說明 |
| 無型別聲明 | PHP 為動態語言,屬性型別由賦值決定(整數、字串、物件、資源等) |
| 建議加註釋 | /** @var string $name 用戶名稱 */ 供 IDE 與靜態分析工具使用 |
| 同一可視性可合行 | private $password, $lastLogin; |
| 靜態屬性 | static $count = 0; 類級共享,透過 self::$count 存取 |
| 常數 | const PI = 3.14; 類級常數,透過 ClassName::PI 或 self::PI 存取 |
3. 方法定義規則
- 語法與函數相同,但**擁有獨立命名空間**——類內可定義與全域函數同名方法(如
date())不衝突。
- **不可使用 PHP 關鍵字**作為方法名(
for、while、echo 等)。
$this 偽變數:僅在物件上下文中可用,指向當前實例,**方法內區域變數不自動指向屬性**,必須顯式 $this->prop。
4. 存取控制修飾符
| 修飾符 | 屬性/方法可存取範圍 |
public | 任何位置 |
protected | 本類、子類、父類 |
private | **僅本類**(子類不可見,PHP 4 無此修飾符) |
※ PHP 4 僅有 var(相當於 public),PHP 5 引入三級可視性,大幅強化封裝性。
5. Type Hint(型別提示)
在方法參數前指定**類名**(或介面名),強制呼叫者傳遞該類型實例:
class Widget {
public $name = 'none';
public $created = false;
}
class Assembler {
// 參數必須是 Widget 實例
public function make(Widget $w) {
echo "Making {$w->name}<br>";
$w->created = true;
}
}
$thing = new Widget();
$thing->name = 'Gadget';
Assembler::make($thing); // 正確
// Assembler::make('not an object'); // 致命錯誤:Argument must be instance of Widget
- **僅支援類/介面型別**,**不支援**標量型別(int、string、bool、array 等)——PHP 7.0+ 才引入標量型別宣告。
- 陣列型別提示在 PHP 5.1+ 以
array 關鍵字支援(有爭議,文檔標註)。
- 違反時拋出 Catchable Fatal Error,可被
set_error_handler 捕獲轉為異常。
6. 實戰範例:User 類完整定義
<?php
class User {
// 屬性
public $name;
private $password, $lastLogin;
static $accessCount = 0;
// 建構子
public function __construct($name, $password) {
$this->name = $name;
$this->password = $password;
$this->lastLogin = time();
self::$accessCount++;
}
// 方法
public function getLastLogin() {
return date('M d Y', $this->lastLogin);
}
}
// 使用
$user = new User('Leon', 'sdf123');
echo $user->getLastLogin() . "<br>"; // 如: Jul 15 2024
echo $user->name . "<br>"; // Leon
?>
7. 進階:靜態成員與延遲靜態綁定
self::$staticProp / self::staticMethod():綁定**定義時的類**(早期綁定)。
static::$staticProp / static::staticMethod():PHP 5.3+ **延遲靜態綁定**,綁定**實際呼叫的類**(晚期綁定),解決繼承中靜態成員多態問題。
總結
PHP 5 類定義核心在於:**屬性無型別但建議註釋、方法擁有獨立命名空間、三級存取控制強化封裝、Type Hint 提供執行時型別檢查(類/介面)**。掌握這些語法細節,是編寫可維護、可擴展物件導向代碼的基礎。
- 上一篇文章: PHP 5 物件導向核心筆記(四):建構子、解構子與繼承機制
- 下一篇文章: PHP 5 物件導向核心筆記(二):物件模型革新——參考傳遞、效能提升與解構子
Copyright ©
程式碼之家 All Rights Reserved