class 將資料 (var/public/protected/private) 與方法 (function) 綁定,使用 $this->property 存取成員。class Child extends Parent 繼承父類所有非私有成員,可覆寫方法、新增屬性。<?php
class Something {
// 命名慣例:類別 PascalCase、屬性/方法 camelCase
public $x; // PHP 5+ 建議加可見性關鍵字
public function setX($v) {
$this->x = $v;
}
public function getX() {
return $this->x;
}
}
// 建立物件
$obj = new Something();
$obj->setX(5);
echo $obj->getX(); // 5
// 不建議直接存取屬性(破壞封裝)
// $obj->x = 6; // 可行但違反 OOP 原則
?>
class Another extends Something {
public $y;
public function setY($v) { $this->y = $v; }
public function getY() { return $this->y; }
// 覆寫父類方法
public function getX() {
return "Child: " . parent::getX(); // 可呼叫 parent::method()
}
}
$obj2 = new Another();
$obj2->setX(6);
$obj2->setY(7);
echo $obj2->getX(); // "Child: 6"
echo $obj2->getY(); // 7
注意: PHP 不支援多重繼承,但可用 trait (PHP 5.4+) 實現程式碼複用。
class Something {
public $x;
// PHP 5+ 建議使用 __construct()
public function __construct($y = 3) { // 預設參數
$this->x = $y;
}
// PHP 5+ 支援解構子
public function __destruct() {
// 資源清理(關閉連線、釋放鎖等)
}
}
$obj = new Something(); // $x = 3
$obj = new Something(8); // $x = 8
$obj = new Something(8, 9); // 錯誤:參數過多(除非用 func_get_args 處理)
父類建構子不會自動呼叫,子類需显式呼叫:
class Another extends Something {
public function __construct() {
$this->y = 5;
parent::__construct(); // 必須手動呼叫
}
}
abstract class Base {
abstract protected function doWork(); // 強制子類實作
public function templateMethod() {
// 模板方法模式
$this->doWork();
}
}
class Concrete extends Base {
protected function doWork() { echo "Working..."; }
}
// new Base(); // 錯誤:無法實例化抽象類
$c = new Concrete();
$c->templateMethod();
interface Logger {
public function log(string $msg);
}
class FileLogger implements Logger {
public function log(string $msg) { file_put_contents('log.txt', $msg . PHP_EOL, FILE_APPEND); }
}
class DbLogger implements Logger {
public function log(string $msg) { /* DB 寫入 */ }
}
// 依賴介面而非具體類別
function process(Logger $logger) { $logger->log("Processing..."); }
process(new FileLogger());
process(new DbLogger());
class Calculator {
public static $pi = 3.14159;
public static function add($x, $y) {
return $x + $y;
}
}
echo Calculator::$pi; // 3.14159
echo Calculator::add(3,7); // 10
// 延遲靜態綁定 (PHP 5.3+)
class A {
public static function who() { echo __CLASS__; }
public static function test() { static::who(); } // static:: 而非 self::
}
class B extends A {
public static function who() { echo __CLASS__; }
}
B::test(); // 輸出 "B" (而非 "A")
| 方法 | 觸發時機 |
|---|---|
__construct() | 物件建立 |
__destruct() | 物件銷毀 |
__call($name, $args) | 呼叫不可見/不存在方法 |
__callStatic($name, $args) | 靜態呼叫不可見/不存在方法 |
__get($name) | 讀取不可見/不存在屬性 |
__set($name, $value) | 寫入不可見/不存在屬性 |
__isset($name) | isset() 檢查不可見屬性 |
__unset($name) | unset() 不可見屬性 |
__sleep() | serialize() 前 |
__wakeup() | unserialize() 後 |
__toString() | 物件當字串使用 (echo $obj) |
__invoke() | 物件當函式呼叫 ($obj()) |
__set_state($arr) | var_export() 匯出類別 |
__clone() | clone $obj 後 |
__debugInfo() | var_dump() 時 |
$obj1 = new Something(5);
$obj2 = $obj1; // 參考賦值:指向同一物件
$obj3 = clone $obj1; // 淺層複製:新物件,屬性值複製(資源/物件屬性仍共享)
// 比較
$obj1 == $obj2; // true:屬性值相同且同類別
$obj1 === $obj2; // true:同一實例
$obj1 === $obj3; // false:不同實例
declare(strict_types=1); // 檔案最頂端
function setX(int $v): void { // 參數型別、回傳型別
$this->x = $v;
}
// 類別型別提示
function process(Logger $logger): bool { ... }
// 介面型別提示
function save(Persistable $entity): void { ... }
<?php
namespace App\Models;
use App\Interfaces\Logger;
use Psr\Log\LoggerInterface as PsrLogger;
class User implements Logger {
// ...
}
// 使用
$user = new \App\Models\User();
$user = new User(); // 同命名空間
$user = new \Psr\Log\LoggerInterface(); // 完整路徑
搭配 Composer PSR-4 自動載入:
// composer.json
{
"autoload": {
"psr-4": { "App\\": "src/" }
}
}
trait Loggable {
public function log($msg) { error_log($msg); }
}
class User {
use Loggable;
}
class Order {
use Loggable;
}
$user = new User();
$user->log("User logged in"); // 直接使用 trait 方法
$logger = new class implements Logger {
public function log($msg) { echo "LOG: $msg"; }
};
$logger->log("test");
public/protected/private)。__construct() 而非同名方法。final 防止被繼承/覆寫。__destruct() 或實作 Disposable 介面配合 try/finally。declare(strict_types=1)。PHP 從早期簡易的 class Something { var $x; } 演進至今,已具備完整的現代 OOP 特性:可見性、抽象類/介面、Trait、靜態綁定、型別提示、命名空間、魔術方法等。掌握這些特性並遵循 SOLID 原則,即能用 PHP 開發出可維護、可擴充、可測試的大型應用系統。