摘要:PHP8中不但新增了許多新特性,還新增了很多方法及系統優化,例如新的Mixed偽類型、新增的三個字符串函數:str_contains、str_starts_with、str_ends_with...
在上一篇文章中,我們總結了PHP8中的一部分新特性,這篇中主要總結PHP8新增的方法及系統優化。
1.新的Mixed偽類型
function show(mixed $name){ var_dump($name); } show(true);
mixed等效于所有類型的聯合類型
string|int|float|bool|null|array|object|callable|resource
2.新增的三個字符串函數
str_contains
str_contains檢查另一個字符串中是否包含一個字符串,并返回一個布爾值(true/ false)是否找到該字符串
以往檢查字符串是否包含在另一個字符串中的典型方法通常是使用函數strpos或strstr。
str_contains("abc", "a"); // true str_contains("abc", "d"); // false // 空字符串是,都是返回true str_contains("abc", ""); // true str_contains("", ""); // true
str_starts_with
str_starts_with檢查一個字符串是否以另一個字符串開頭并是否返回布爾值(true/ false)。
str_ends_with
str_ends_with檢查一個字符串是否以另一個字符串結尾,是否返回布爾值(true/ false)。
$str = "beginningMiddleEnd"; var_dump (str_starts_with($str, "beg")) ; //true var_dump (str_starts_with($str, "Beg")); //false var_dump (str_ends_with($str, "End")) ;//true var_dump (str_ends_with($str, "end"));//false // 空字符串:任何字符串以空字符串去檢查都是true var_dump (str_starts_with("a", "")) ;//true var_dump (str_starts_with("", "")) ;//true var_dump (str_starts_with("", "a"));//false var_dump (str_ends_with("a", "")) ;//true var_dump (str_ends_with("", "")) ;//true var_dump (str_ends_with("", "a"));//false
3.新增Static類方法的返回類型
class Foo { public static function getInstance(): static { return new static(); } }
4.可選參數之后禁止出現必選參數
//這里在PHP8中會報錯 function show($age=18,$name){ echo "$name,$age"; } show(25, 'yzmcms');
5.繼承規則不適用于Private類方法
class Foo { final private function testFoo(){} }
以上代碼在PHP8中會報錯,私有方法不能是final,因為它們從不被其他類重寫。
6.非靜態方法不允許以靜態方式來調用
class Person{ public function show(){ echo 123; } } Person::show();
以上代碼在PHP7中這么寫只是會報一個Deprecated錯誤,但也會正常執行,而在PHP8中將會報Fatal error
7.字符串和數字比較調整
在php8中,數字和字符串比較時,會將數字轉成字符串,正好和之前相反。
//php7 0 == 'foobar' // true //php8 0 == 'foobar' // false
8.@運算符不再使致命錯誤不提醒
此更改可能會使 PHP 8 之前的版本被 @ 隱藏的錯誤再次顯示出來。請確保在生產服務器上設置了 display_errors=Off !
9.重新分類的引擎警告
許多以前僅觸發警告或通知的錯誤已轉換為適當的錯誤。以下警告已更改:
變量未定義:Error 異常代替通知
數組索引未定義:警告代替通知
除以零:DivisionByZeroError 異常代替警告
嘗試添加 / 移除非對象的屬性 '% s' :Error 異常代替警告
嘗試修改非對象的屬性 '% s' :Error 異常代替警告
嘗試分配非對象的屬性 '% s' :Error 異常代替警告
從空值創建默認對象:Error 異常代替警告
嘗試獲取非對象的屬性 '% s' :警告代替通知
未定義的屬性:% s::$% s:警告代替通知
無法添加元素到數組,因為下一個元素已被占用:Error 異常代替警告
無法在非數組變量中銷毀偏移量:Error 異常代替警告
無法將標量值用作數組:Error 異常代替警告
只有數組和 Traversables 可以被解包:TypeError 異常代替警告
為 foreach () 提供了無效的參數:TypeError 異常代替警告
偏移量類型非法:TypeError 異常代替警告
isset 或 empty 中的偏移量類型非法:TypeError 異常代替警告
unset 中的偏移量類型非法:TypeError 異常代替警告
數組到字符串的轉換:警告代替通知
資源 ID#% d 用作偏移量,轉換為整數 (% d):警告代替通知
發生字符串偏移量轉換:警告代替通知
未初始化的字符串偏移量:% d:警告代替通知
無法將空字符串分配給字符串偏移量:Error 異常代替警告
提供的資源不是有效的流資源:TypeError 異常代替警告