__construct() 是 PHP 類別的建構函式,當物件被實例化(new ClassName())時自動呼叫。它是物件初始化的核心入口,正確理解其機制對編寫健壯的 OOP 程式碼至關重要。
<?php
class MyName {
public function __construct(string $name) {
// 兩個底線 __construct
echo "我的名字是:$name<br>";
}
}
$name1 = new MyName("小貓"); // 輸出:我的名字是:小貓
$name2 = new MyName("小狗"); // 輸出:我的名字是:小狗
$name3 = new MyName("小馬"); // 輸出:我的名字是:小馬
?>
new 關鍵字觸發,無需手動呼叫。new Class($arg1, $arg2) 直接對應建構函式參數。new 都會重新執行建構函式。throw new Exception() 阻止物件建立。PHP 4 時代使用「與類別同名」的函式作為建構函式:
<?php
class MyName {
// PHP 4 風格建構函式(PHP 7+ 已移除支援)
function MyName($name) {
echo "我的名字是:$name<br>";
}
}
?>
重大差異:
| 特性 | __construct (PHP 5+) | 同名函式 (PHP 4) |
|---|---|---|
| PHP 8 相容性 | ✅ 完全支援 | ❌ 已移除,會報錯 |
| 繼承行為 | 子類別未定義 __construct 會自動呼叫父類別 | 需手動呼叫 parent::ParentClass() |
| 命名空間影響 | 不受影響 | 類別更名時必須同步修改函式名 |
| 靜態分析工具支援 | 完美識別 | 常被誤判為普通方法 |
<?php
class Animal {
protected string $name;
public function __construct(string $name) {
$this->name = $name;
echo "Animal 建構:$name\n";
}
}
class Dog extends Animal {
private string $breed;
public function __construct(string $name, string $breed) {
parent::__construct($name); // 必須顯式呼叫父類別建構函式
$this->breed = $breed;
echo "Dog 建構:$name ($breed)\n";
}
}
$dog = new Dog("旺財", "柴犬");
// 輸出順序:
// Animal 建構:旺財
// Dog 建構:旺財 (柴犬)
?>
規則:子類別定義了 __construct 時,不會自動呼叫父類別建構函式,必須手動 parent::__construct(...)。若子類別未定義,則自動繼承父類別建構函式。
class User {
private string $name;
private string $email;
private function __construct(string $name, string $email) {
$this->name = $name;
$this->email = $email;
}
public static function createFromArray(array $data): self {
return new self($data['name'], $data['email']);
}
public static function createGuest(): self {
return new self('Guest', 'guest@example.com');
}
}
$user1 = User::createFromArray(['name' => 'John', 'email' => 'john@example.com']);
$user2 = User::createGuest();
private 強制使用工廠方法。createFromArray、createGuest)。class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0
) {}
}
$p = new Point(1.5, 2.5); // $p->x=1.5, $p->y=2.5, $p->z=0.0
__construct,棄用同名函式風格。public function __construct(string $name, int $age)。new。InvalidArgumentException。parent::__construct()。掌握 __construct 的正確用法與繼承機制,是寫出可維護、可測試、符合現代 PHP 標準的物件導向程式碼的基石。