截至 2014 年初,PHP 最新穩定版本為 5.5,但仍有近半數用戶停留在已停止維護的 PHP 5.2,其餘多數使用 PHP 5.3。由於 PHP 語法特殊且社區氛圍一般,許多開發者對新版本特性缺乏關注。本文將系統梳理從 PHP 5.2 到 PHP 5.6 之間新增的核心功能,幫助開發者快速掌握版本演進脈絡。
在正式介紹各版本新功能前,先回顧幾個 PHP 5.2 已存在但極具代表性的特性。
早期使用 __autoload() 函數實現類文件自動載入,但該函數全局僅能定義一個,無法滿足多類庫並存需求。PHP 引入 spl_autoload_register() 解決此問題,它將多個自定義載入函數註冊到 SPL(標準 PHP 庫)隊列中,按註冊倒序調用,完美支援多套自動載入規則共存。
spl_autoload_register(function($classname) {
require_once "{$classname}.php";
});
傳統 mysql_* 函數僅支援 MySQL 且缺乏預處理機制。PDO(PHP Data Objects) 提供統一的資料庫存取介面,支援預編譯、參數綁定、物件導向風格,且可無縫切換資料庫;MySQLi 則是 MySQL 專用增強驅動,提供程序式與物件導向雙重介面,支援 MySQL 獨有高級功能。官方推薦優先使用 PDO,僅在需 MySQL 專屬特性時選用 MySQLi。
PHP 5 開始支援函數參數類型約束,但僅限於 class、callable、array,不支援 string、int 等純量型別。
新增 json_encode()、json_decode() 等函數,實現 PHP 陣列/物件與 JSON 字串雙向轉換。注意 json_decode() 預設回傳 stdClass 物件,若需關聯陣列需將第二參數設為 true。
PHP 5.3 引入大量新特性並進行不向下相容調整,是現代 PHP 開發的分水嶺。
$_GET/$_POST 自動註冊為全域變數,導致嚴重安全漏洞,PHP 5.4 完全移除。引入 function() {} 語法建立無名函數,配合 use 關鍵字捕獲外部變數,廣泛用於回呼、陣列處理等場景。
__invoke():物件被當函數呼叫時觸發。__callStatic():呼叫不存在的靜態方法時觸發。採用反斜槓 \ 作為分隔符,支援子命名空間、別名導入(use),配合 spl_autoload_register 實現 PSR-0/PSR-4 自動載入標準。
解決 self:: 靜態綁定無法多態的問題,新增 static:: 關鍵字,在繼承鏈中動態解析至實際調用類。
Heredoc 行為類似雙引號字串(可插值變數),Nowdoc 行為類似單引號字串(不插值),均支援於函數參數、類常數/屬性初始化。
除 define() 外,可在全域與類中使用 const 定義編譯期常數,語法更簡潔且效能略優。
$a ?: 'default' 等價於 $a ? $a : 'default',減少重複程式碼。
將多個 PHP 腳本打包為單一 .phar 壓縮檔(類似 Java JAR),支援數位簽章驗證,可直接被 PHP 引擎執行或 require 包含。
<?= $var ?> 簡寫標籤自 5.4 起永久可用,無需 short_open_tag 設定。純 PHP 檔案建議省略結束標籤 ?>,避免輸出空白導致 Header/Cookie 設定失敗。
['key' => 'value'] 取代 array('key' => 'value'),大幅提升可讀性。
解決 PHP 單一繼承限制,trait 可被多個類 use,支援衝突解決、存取權限修改、方法別名等進階功能。
php -S localhost:8000 即啟動輕量開發伺服器,支援路由腳本(php -S localhost:8000 index.php)與 XDebug 斷點除錯,僅供開發測試環境使用。
A::{$func}()(new MyClass)->method()func()[0]函數中使用 yield 逐個產出值,回傳 Generator 物件實作迭代器,記憶體效率極高,適合處理大型資料集。
foreach ($arr as list($a, $b, $c)) 直接解構巢狀陣列元素。
mysql_* 函數,推薦 PDO/MySQLiMyClass::class 取得完整限定類名empty() 支援任意運算式try-catch 新增 finally 區塊允許常數定義時使用先前常數運算(const B = A + 1),支援常數作為函數預設參數值。
function add(...$args) 取代 func_get_args(),呼叫時可用 ...$arr 解包陣列為參數列表。
use const Name\Space\FOO; use function Name\Space\f; 實現函數/常數的跨命名空間別名導入。
更多遷移細節請參考官方手冊:PHP 5.5 遷移指南、PHP 5.6 遷移指南。