?? 一、棄用 & 將被移除的功能
1?? 動(dòng)態(tài)屬性寫(xiě)入
- 風(fēng)險(xiǎn):PHP 8.2 開(kāi)始動(dòng)態(tài)屬性寫(xiě)入已觸發(fā) E_DEPRECATED,PHP 8.6 將更嚴(yán)格。
- 排查:使用 #[AllowDynamicProperties] 或者在類(lèi)里顯式定義所有屬性。
php復(fù)制編輯class User {
public string $name;
}
// 不要在外部動(dòng)態(tài) $user->age = 30;
2?? utf8_encode() 和 utf8_decode()
- 很可能在 8.6 標(biāo)記棄用,為 PHP 9 移除做準(zhǔn)備。
- 改用 mb_convert_encoding()。
3?? 老的 Serializable 接口
- 推薦改用 __serialize() 和 __unserialize()。
4?? create_function()
- 已棄用多年,若還存在必須替換為 Closure 或 fn()。
?? 二、類(lèi)型 & 嚴(yán)格性提升
1?? 未定義變量或數(shù)組鍵
- PHP 8.6 會(huì)繼續(xù)提高“未定義”拋錯(cuò)的覆蓋率。
- 尤其是空數(shù)組自動(dòng)追加:$a = false; $a[] = 1; → 會(huì)拋 TypeError。
2?? 內(nèi)置函數(shù)對(duì) null 的容忍度
- 例如:strlen(null)、array_keys(null),未來(lái)會(huì)直接拋 TypeError。
- 建議靜態(tài)分析時(shí)啟用 strict_types=1 并使用 Psalm / PHPStan 檢查。
3?? #[Override] 屬性
- 若用 #[Override] 標(biāo)記,必須真覆蓋父類(lèi)/接口,trait 也要匹配。
- 保證方法簽名一致,否則 8.6 將報(bào)錯(cuò)。
4?? 交叉類(lèi)型(Intersection Types)
- 檢查是否使用組合類(lèi)型,8.6 中解析器對(duì)復(fù)雜場(chǎng)景會(huì)更嚴(yán)格,建議單測(cè)覆蓋。
?? 三、語(yǔ)法層面
1?? 字符串插值
- ${var} 這種復(fù)雜插值語(yǔ)法將逐步廢棄,建議統(tǒng)一用 "Hello $var" 或 "Hello {$var}"。
2?? 靜態(tài)變量
- 靜態(tài)變量類(lèi)型更嚴(yán)格,推薦總是初始化時(shí)指定值。
?? 四、配置 & 性能
1?? OPCache
- 檢查 opcache.validate_timestamps、opcache.jit 配置是否符合預(yù)期。
- 有些 JIT/inline 行為可能影響微小性能,升級(jí)后需重新 benchmark。
2?? GC 行為
- 若項(xiàng)目對(duì)垃圾回收敏感(如長(zhǎng)駐 CLI、Swoole),觀察 gc_status() 輸出是否有異常循環(huán)引用。
3?? Randomizer
- 如果依賴(lài)隨機(jī)數(shù)可重復(fù)性,盡量顯式指定 Random\Engine 而非 rand() / mt_rand()。
?? 五、推薦工具
? 啟用:
- declare(strict_types=1);
- 靜態(tài)分析:PHPStan / Psalm
- composer outdated 檢查依賴(lài)是否支持 PHP 8.6。
?? 一行總結(jié)
“先修所有 E_DEPRECATED,清理所有未定義用法,跑靜態(tài)分析,一切穩(wěn)了!”
如果需要,我可以幫你出:
- 一份 VSCode / PHPStorm 的檢測(cè)規(guī)則清單
- 一份 .phpcs.xml 檢查規(guī)范
- 一個(gè) 8.6 升級(jí)的 Composer 依賴(lài)兼容性檢查腳本