PHP 6 計劃於 2005 年左右啟動,核心目標是原生 Unicode 支持(基於 ICU 庫),將字符串內部表示統一為 UTF-16,並引入 UnicodeString 類、命名空間、goto 等特性。但因性能倒退、ICU 耦合複雜、社區分歧等原因,PHP 6 於 2010 年正式終止,相關特性分拆至 PHP 5.3/5.4/7.0 逐步落地。
| 特性 | PHP 6 設計 | 最終落地版本/方式 |
|---|---|---|
| 內部字符串編碼 | UTF-16 | PHP 7 仍用字節字符串,但默認 UTF-8 |
| UnicodeString 類 | 原生對象,支持字符級操作 | 未實現,社區用 intl 擴展替代 |
| 正則 Unicode 屬性 | 原生支持 \p{L} 等 | PHP 5.3+ PCRE 已支持(需 /u 修飾符) |
| 標準庫函數 Unicode 化 | 所有函數按字符而非字節 | 部分函數新增 mb_* 並行族群 |
| 輸入/輸出編碼自動轉換 | 內核層面透明處理 | 開發者自行管理(mb_internal_encoding) |
<?php
// 入口文件最頂部
declare(encoding='UTF-8');
mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_regex_encoding('UTF-8');
<?php
$str = '你好世界';
// 長度(字符數)
echo mb_strlen($str); // 5
// 截取
echo mb_substr($str, 0, 2); // 你好
// 大小寫(需注意語言環境)
echo mb_strtoupper('straße', 'UTF-8'); // STRASSE
<?php
preg_match('/^[\p{Han}]+$/u', '漢字'); // true
preg_replace('/\s+/u', '-', 'a b c'); // a-b-c
<?php
// 區域感知排序
$coll = new Collator('zh_CN');
$arr = ['张三', '李四', '王五'];
$coll->sort($arr); // 按拼音/筆畫排序
// 數字/日期/貨幣格式化
$fmt = new NumberFormatter('zh_CN', NumberFormatter::CURRENCY);
echo $fmt->formatCurrency(1234.56, 'CNY'); // ¥1,234.56
// 斷詞
$break = new BreakIterator('zh_CN');
$break->setText('你好世界');
foreach ($break as $offset) { /* ... */ }
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', $user, $pass);
$pdo->exec("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci");
PHP 6 的失敗讓社區吸取教訓:大爆炸式重寫風險極大。現代 PHP 採取增量演進策略,通過 intl、mbstring、PDO::MYSQL_ATTR_INIT_COMMAND 等組合,已能滿足 99% 國際化需求。PHP 8.1+ 新增的 Stringable 接口、mb_str_pad 等進一步完善生態。
雖然 PHP 6 未曾面世,但其推動的 Unicode 意識已深入 PHP 開發者 DNA,成為現代 Web 開發的基礎素養。