類別是物件的藍圖,封裝了屬性(資料)與方法(行為)。實例化後得到「物件」,每個物件擁有獨立的屬性值,共享相同的方法定義。
<?php
class MyClass {} // 合法但無功能
class MyClass {
public $username = '深空'; // 預設值
public $email; // 無預設值
}
public:類別內外皆可存取protected:類別內與子類別可存取private:僅類別內部可存取class MyClass {
public $username = '深空';
public function greet() {
return "Hello, {$this->username}!";
}
public function setUsername($name) {
$this->username = $name;
}
}
$this 代表「當前物件實例」,唯有透過它存取屬性與呼叫其他方法。
$obj1 = new MyClass();
$obj2 = new MyClass();
$obj1->setUsername('Alice');
$obj2->setUsername('Bob');
echo $obj1->greet(); // Hello, Alice!
echo $obj2->greet(); // Hello, Bob!
兩個物件互不干擾,各自維護 $username 狀態。
class User {
public $name;
public function __construct($name) {
$this->name = $name;
echo "User {$name} created.\n";
}
public function __destruct() {
echo "User {$this->name} destroyed.\n";
}
}
$user = new User('Charlie'); // 自動呼叫 __construct
// 腳本結束或 unset($user) 時呼叫 __destruct
class Counter {
public static $count = 0;
public static function increment() {
self::$count++;
}
}
Counter::increment();
echo Counter::$count; // 1(不需實例化)
self:: 呼叫靜態成員static:: 延遲靜態綁定(繼承時指向實際被呼叫的類別)class Animal {
public function speak() { echo "Some sound\n"; }
}
class Dog extends Animal {
public function speak() { echo "Woof!\n"; } // 覆寫
}
$animals = [new Animal(), new Dog()];
foreach ($animals as $a) { $a->speak(); } // 多型:同樣呼叫,不同行為
$username vs $this->usernamestatic 或獨立函數介面 interface → 抽象類別 abstract class → Trait 程式碼複用 → 設計模式 → 依賴注入容器