<?php
class User {
// 屬性(成員變量)
public $name = 'Guest';
public $age = 0;
// 構造函數:創建對象時自動調用
public function __construct($name = '', $age = 0) {
$this->name = $name;
$this->age = $age;
}
// 方法(成員函數)
public function greet() {
echo "Hello, I'm {$this->name}, {$this->age} years old.
";
}
}
// 實例化
$user1 = new User('Alice', 25);
$user1->greet(); // 輸出: Hello, I'm Alice, 25 years old.
// 修改屬性
$user1->age = 26;
$user1->greet();
?>
| 關鍵字 | 訪問範圍 |
|---|---|
| public | 任何位置(類內、子類、外部) |
| protected | 類內 + 子類 |
| private | 僅本類內部 |
class Base {
private $secret = 'private';
protected $family = 'protected';
public $open = 'public';
public function show() {
echo $this->secret; // 類內可訪問 private
}
}
class Child extends Base {
public function test() {
// echo $this->secret; // ❌ Fatal error
echo $this->family; // ✅ 子類可訪問 protected
echo $this->open; // ✅
}
}
通過 __get()、__set()、__isset()、__unset() 實現對不可見屬性的攔截,常用於代理、延遲加載等場景。
class Container {
private $data = [];
public function __set($key, $value) {
$this->data[$key] = $value;
}
public function __get($key) {
return $this->data[$key] ?? null;
}
public function __isset($key) {
return isset($this->data[$key]);
}
public function __unset($key) {
unset($this->data[$key]);
}
}
$c = new Container();
$c->name = 'Bob'; // 觸發 __set
echo $c->name; // 觸發 __get
unset($c->name); // 觸發 __unset
PHP 不會自動調用父類構造函數,子類需顯式呼叫 parent::__construct()。
class Animal {
public function __construct(public $species) {
echo "Animal created: {$species}
";
}
}
class Dog extends Animal {
public function __construct(public $name) {
parent::__construct('Dog'); // 必須顯式調用
echo "Dog named {$name}
";
}
}
$dog = new Dog('Lucky');
interface Drawable {
public function draw();
}
class Circle implements Drawable {
public function draw() { echo "Drawing a circle
"; }
}
class Square implements Drawable {
public function draw() { echo "Drawing a square
"; }
}
function render(Drawable $shape) {
$shape->draw(); // 根據實際對象類型執行不同邏輯
}
render(new Circle()); // Drawing a circle
render(new Square()); // Drawing a square
PHP 4 風格使用 var 定義屬性、類名作為構造函數名,已不推薦。請統一使用 public/protected/private + __construct()。
掌握類的定義、可見性、構造函數、繼承、多態及魔術方法,即可編寫結構清晰、可維護的 PHP OOP 代碼。進階可學習介面、抽象類、Trait、依賴注入等模式。