核心變更總覽
| 特性 | PHP 4 | PHP 5 |
| 物件傳遞 | 值傳遞 (複製) | 參考傳遞 (handle) |
| 建構子 | 同類別名函數 | __construct() |
| 解構子 | 無 | __destruct() |
| 存取控制 | 全部 public | public/protected/private |
| 介面 | 無 | interface、implements |
| 抽象類別 | 無 | abstract class、abstract method |
| 靜態成員 | 無 | static 屬性/方法 |
| 最終類別/方法 | 無 | final |
| 類別常數 | 無 | const |
| 自動載入 | 無 | __autoload() (後來 spl_autoload_register) |
| 例外處理 | 無 | try/catch/throw、Exception |
遷移步驟實戰
1. 建構子重命名
_items['imgpath'] = 'images'; }
function get($key) { return $this->_items[$key]; }
}
// PHP 5
class Config {
private array $_items = [];
public function __construct() { $this->_items['imgpath'] = 'images'; }
public function get(string $key): mixed { return $this->_items[$key] ?? null; }
}
2. 加入存取控制
private:僅類別內部可存取
protected:類別與子類別可存取
public:公開介面
- 預設建議
private,需要再放寬
3. 導入介面契約
data = parse_ini_file($file, true);
}
public function get(string $key): mixed { return $this->data[$key] ?? null; }
public function set(string $key, mixed $value): void { $this->data[$key] = $value; }
}
4. 使用例外處理取代錯誤代碼
prepare($sql);
$stmt->execute();
return $stmt->fetchAll();
} catch (PDOException $e) {
throw new RepositoryException('Query failed', 0, $e);
}
5. 靜態成員與晚期靜態綁定 (PHP 5.3+)
遷移檢查清單
- [ ] 所有建構子改為
__construct()
- [ ] 加入存取修飾詞
- [ ] 介面化關鍵契約
- [ ] 移除
& 參考傳遞 (物件預設參考)
- [ ] 替換全域變數為依賴注入
- [ ] 統一錯誤處理為例外
- [ ] 實作
__autoload / Composer 自動載入
- [ ] 測試序列化/反序列化行為 (
__sleep/__wakeup)
- [ ] 檢查
clone 行為 (淺拷貝 → 實作 __clone 深拷貝)
PHP 5.6 / 7.0 / 8.x 後續演進重點
- 5.6:
... 可變參數、** 冪次、常數標量運算式
- 7.0:標量/回傳型別宣告、
?? 空合併、<=> 太空船、匿名類別、錯誤改為例外
- 7.1:可為 null 型別、
void 回傳、對稱陣列解構
- 7.4:型別屬性、箭頭函數、
??=、預載入
- 8.0:JIT、Union Types、Named Arguments、Attributes、Match Expression、Constructor Promotion
- 8.1:Enums、Fibers、readonly、never、Final Constants
- 8.2:Readonly Classes、DNF Types、Random Extension
- 8.3:Typed Class Constants、json_validate、Randomizer