PHP 歷經 28 年演進,從 Rasmus Lerdorf 1994 年為統計訪問量編寫的 Perl 腳本,成長為支撐 WordPress、Facebook、Wikipedia、Slack 等全球頭部產品的核心語言。本文梳理版本演進脈絡、核心架構變革、關鍵特性時間線,並展望未來方向。
| 版本 | 年份 | 代號/核心 | 里程碑意義 |
|---|---|---|---|
| PHP 1.0 | 1995 | PHP Tools | 首發,訪客計數器、留言本,模板語法 |
| PHP 2.0 (PHP/FI) | 1996 | Form Interpreter | mSQL 支持、條件判斷、循環、數組,確立動態頁面地位 |
| PHP 3.0 | 1998 | Zeev & Andi 重寫解析器 | 模塊化架構、ODBC/多數據庫、Apache 模塊、爆發式增長(15萬站點) |
| PHP 4.0 | 2000 | Zend Engine 1.0 | Zend 引擎、Session、輸出緩衝、更安全輸入處理、擴展 API 規範化 |
| PHP 5.0 | 2004 | Zend Engine 2.0 | 物件模型重寫(引用語義)、PDO、SimpleXML、SPL、異常、反射、自動加載 |
| PHP 5.3 | 2009 | 命名空間、晚期靜態綁定 | 現代 PHP 基石:命名空間、閉包、__invoke、PHAR、MySQLnd |
| PHP 5.4 | 2012 | Traits、內建服務器 | 代碼復用新機制、短標簽 []、移除 register_globals/magic_quotes |
| PHP 5.5 | 2013 | Generators、finally | 惰性迭代、異常 finally、OPcache 內建、密碼哈希 API |
| PHP 5.6 | 2014 | 常量標量表達式、可變參數 | ... 操作符、use function/const、phpdbg、OpenSSL 改進 |
| PHP 7.0 | 2015 | Zend Engine 3.0 (PHPNG) | 性能翻倍、標量/返回類型聲明、??、<=>、錯誤異常化、匿名類、移除舊 SAPI/擴展 |
| PHP 7.1 | 2016 | 可空類型、void 返回 | ?Type、void、類常量可見性、負數字符串索引 |
| PHP 7.2 | 2017 | 對象類型聲明、Argon2 | object 類型、擴展加載機制、Libsodium 內建 |
| PHP 7.3 | 2018 | Heredoc/Nowdoc 改進 | 尾隨逗號、JSON 錯誤處理、PCRE2、list() 解構鍵名 |
| PHP 7.4 | 2019 | 類型屬性、箭頭函數 | public int $id、fn() =>、預加載、擴展運算符數組、FFI |
| PHP 8.0 | 2020 | JIT 編譯器 | JIT、聯合類型、屬性、match 表達式、命名參數、Constructor Promotion、nullsafe 操作符 |
| PHP 8.1 | 2021 | Enum、Fiber、never | 枚舉、纖程(協程基礎)、never 返回類型、readonly 屬性、first-class callable |
| PHP 8.2 | 2022 | readonly 類、DNF 類型 | 只讀類、析構類型、隨機擴展、敏感參數屬性 |
| PHP 8.3 | 2023 | 類型化類常量、json_validate | 常量類型聲明、#[Override]、深度克隆、隨機器擴展 |
| PHP 8.4 | 2024 | 屬性鉤子、非對稱可見性 | get/set 鉤子、public private(set)、BCMath 物件 API、新隨機函數 |
__construct/__destructopcache.jit_buffer_size=100M; opcache.jit=1255// PHP 5.0: 類型提示(僅類/介面/array/callable)
function foo(MyClass $obj) {}
// PHP 7.0: 標量類型 + 返回類型 + 嚴格模式
declare(strict_types=1);
function add(int $a, int $b): int { return $a + $b; }
// PHP 7.1: 可空類型 + void
function find(): ?User {}
function log(): void {}
// PHP 8.0: 聯合類型 + 混合類型
function process(int|float $num): string|bool {}
// PHP 8.1: 交集類型 (DNF) + never
function count(Countable&Iterator $it): int {}
function die(): never { exit; }
// PHP 8.2: 只讀類/屬性
readonly class Config { public function __construct(public string $key) {} }
__call/__get 動態特性
// PHP 7: Error 實現 Throwable 接口
// TypeError, ParseError, ArithmeticError, AssertionError, DivisionByZeroError
try { 1/0; } catch (DivisionByZeroError $e) { }
// PHP 8: 更多內部錯誤轉為異常
// 未定義變量/屬性/數組鍵 → Error (非 Notice)
| 特性 | 版本 | 示例 |
|---|---|---|
| 三元運算符簡寫 | 5.3 | $x = $a ?? $b |
| 太空船操作符 | 7.0 | $a <=> $b |
| 解構賦值 | 7.1 | [$a, $b] = $arr |
| 箭頭函數 | 7.4 | fn($x) => $x * 2 |
| match 表達式 | 8.0 | match($x) { 1=>'a', 2=>'b' } |
| 命名參數 | 8.0 | foo(name: 'a', age: 18) |
| nullsafe 操作符 | 8.0 | $obj?->method() |
2005-2010 年曾嘗試開發 PHP 6,核心目標是原生 Unicode 支持(基於 ICU)。因實現極其複雜、性能倒退、開發陷入停滯,最終在 2010 年宣告放棄。相關功能(如 intl 擴展)移植到 PHP 5.3+。為避免版本號混淆,直接跳至 PHP 7。這是開源社區果斷止損、優先交付可用價值的經典案例。
class Collection<T> { public function add(T $item): void {} }(RFC 階段)match ($x) { [1, 2, $rest] => ... }(構想中)async/await 語法糖PHP 的演進史是務實主義的教科書:不追求學術純粹,只解決開發者實際痛點。從模板語言到全棧語言,從進程模型到協程,從動態類型到漸進式類型系統,每次重大版本都精準回應時代需求。今天,PHP 8.4+ 已擁有現代類型系統、JIT 編譯器、協程基礎、屬性鉤子,配合 Swoole/OpenSwoole/RoadRunner,完全具備構建高性能微服務、實時應用、AI 推理服務的能力。選擇 PHP,就是選擇快速交付、生態成熟、長期演進的工程智慧。