PHP 5 起完整支援物件導向(OOP),類是封裝數據與行為的藍圖。本文從零開始,講解類的定義、屬性、方法、實例化、$this 指針、構造函數與實際應用模式。
<?php
class Calculator {
// 屬性(可加可见性:public/protected/private)
public $lastResult = 0;
// 方法
public function add($n1, $n2) {
$this->lastResult = $n1 + $n2;
return $this->lastResult;
}
public function subtract($n1, $n2) {
$this->lastResult = $n1 - $n2;
return $this->lastResult;
}
public function multiply($n1, $n2) {
$this->lastResult = $n1 * $n2;
return $this->lastResult;
}
}
?>
<?php
require 'Calculator.php';
$calc = new Calculator(); // 创建对象
echo $calc->add(10, 5); // 15
echo $calc->subtract(20, 8); // 12
echo $calc->multiply(6, 7); // 42
// 访问属性
echo "上一次結果: {$calc->lastResult}"; // 42
?>
__construct() 初始化狀態<?php
class User {
public $name;
public $email;
// 帶參數構造,支持預設值
public function __construct($name, $email = '') {
$this->name = $name;
$this->email = $email;
}
public function greet() {
return "Hello, {$this->name}!";
}
}
$user1 = new User('小明');
$user2 = new User('小紅', 'xiaohong@example.com');
echo $user1->greet(); // Hello, 小明!
?>
| 關鍵字 | 類內部 | 子類 | 外部 |
|---|---|---|---|
public | ✓ | ✓ | ✓ |
protected | ✓ | ✓ | ✗ |
private | ✓ | ✗ | ✗ |
最佳實踐:屬性預設 private,通過 getter/setter 控制存取;方法預設 public,內部輔助方法用 protected/private。
<?php
class Math {
const PI = 3.1415926;
public static $callCount = 0;
public static function circleArea($r) {
self::$callCount++;
return self::PI * $r * $r;
}
}
echo Math::PI; // 3.1415926
echo Math::circleArea(5); // 78.539815
echo Math::$callCount; // 1
?>
<!-- form.html -->
<?php
// calc.php
require 'Calculator.php';
$calc = new Calculator();
$ops = ['add' => 'add', 'sub' => 'subtract', 'mul' => 'multiply'];
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($ops[$_POST['op']])) {
$method = $ops[$_POST['op']];
$result = $calc->$method($_POST['a'], $_POST['b']);
echo "結果: $result";
}
?>
interface 定義契約,類 implements 實現。abstract class 含抽象方法,不可實例化。trait 實現橫向代碼復用(PHP 5.4+)。__call, __get, __set, __toString, __invoke 等。namespace App\Service; 避免類名衝突,配合 PSR-4 自動載入。new,便於測試與解耦。