name = $name;
$this->age = $age;
}
// 受保護方法:子類可訪問,外部不可訪問
protected function getMessage() {
return "姓名:{$this->name}
年齡:{$this->age}";
}
// __toString: 對象作為字符串輸出時自動調用
public function __toString() {
return "姓名:{$this->name}
年齡:{$this->age}";
}
// __destruct: 對象銷毀時調用
public function __destruct() {
echo "
I am dead!";
}
// __call: 調用不存在的方法時觸發
public function __call($method, $args) {
echo "
調用的方法不存在:$method
";
echo "調用的參數:"; var_dump($args);
}
// final: 禁止子類覆蓋
final public function getF() {
echo "I am getf";
}
}
// 繼承
class Xinxin extends People {
// 覆蓋父類方法
public function getMessage() {
return "I am zilei getmessage
";
}
// 新增方法
public function getName() {
echo $this->getMessage(); // 調用當前類方法
echo parent::getMessage(); // 調用父類方法
return "I am xinxin";
}
// 嘗試覆蓋 final 方法會報錯
// public function getF() { echo "I am new getf"; } // Fatal error
}
// 實例化測試
$pp = new People("小弟", "33");
echo $pp->name . ' ' . $pp->age . "
";
$xx = new Xinxin("小小", "13");
echo $xx->getName();
// 輸出結果:
// 姓名:小弟 年齡:33
//
// I am zilei getmessage
// 姓名:小弟 年齡:33
// I am xinxin
// I am dead!
// I am dead!
| 概念 | 說明 | 示例 |
|---|---|---|
| 構造函數 `__construct` | 實例化時自動調用,初始化狀態 | `new People('A', 18)` |
| 解構函數 `__destruct` | 對象銷毀時調用(腳本結束/引用計數歸零) | 釋放資源、關閉連接 |
| `__toString` | 對象當作字符串使用時調用 | `echo $obj;` |
| `__call` | 調用不可訪問方法時觸發(不存在/權限不足) | `$obj->undefinedMethod()` |
| `__callStatic` | 靜態調用不可訪問方法時觸發 (PHP 5.3+) | `Class::undefinedStatic()` |
| `parent::` | 訪問父類被覆蓋的方法/屬性 | `parent::getMessage()` |
| `final` | 禁止繼承/覆蓋 | `final class` / `final function` |
| 可見性 | public > protected > private | 子類可訪問 protected |
// 1. 類型聲明 (PHP 7.0+)
class People {
public function __construct(
public string $name, // PHP 8.0+ 提升屬性
public int $age
) {}
public function getMessage(): string {
return "{$this->name} ({$this->age})";
}
}
// 2. 介面與抽象類定義契約
interface Greetable {
public function greet(): string;
}
abstract class BasePeople implements Greetable {
// ...
}
// 3. 嚴格類型模式
declare(strict_types=1);
理解 PHP 物件模型的核心機制(構造/解構、魔術方法、可見性、繼承規則)是編寫健壯 OOP 代碼的基礎。現代 PHP (7.1+) 提供了嚴格類型、返回類型聲明、提升屬性等特性,應盡可能使用以提高代碼質量與 IDE 支援。