PHP 8 的新特性(續)
新增 fdiv()
函式 pr
新的 fdiv()
函式的作用類似於 fmod()
和 intdiv()
函式,它們可以除以 0。視情況而定,將得到 INF
,-INF
或 NAN
。
新增 get_debug_type()
函式 rfc
get_debug_type()
返回變數的型別,聽起來好像跟 gettype()
的作用一樣啊?get_debug_type()
可以為陣列,字串,匿名類和物件返回更有用的輸出資訊。
例如,在類\ Foo \ Bar
上呼叫 gettype()
將返回 object
,而使用 get_debug_type()
將返回類名。
如下表:
Value | get_debug_type() | gettype() |
---|---|---|
0 | int | integer |
0.1 | float | double |
true | bool | boolean |
false | bool | boolean |
“hello” | string | |
[] | array | |
null | null | NULL |
A class with name “Foo\Bar” | Foo\Bar | object |
An anonymous class | class@anonymous | object |
A resource | resource (xxx) | resource |
A closed resource | resource (closed) |
可以在 RFC 中找到 get_debug_type()
和 gettype()
之間的差異的完整列表。
新增 get_resource_id()
函式 pr
資源是 PHP 中的特殊變數,指的是外部資源。一個示例是 MySQL 連線,另一個是檔案控制代碼。
這些資源中的每一個都分配有一個 ID,然而在這之前,如果想獲取某資源的 ID,唯一方法是將資源轉換為 int:
$resourceId = (int) $resource;
PHP 8 添加了 get_resource_id() 函式,使此操作更加明顯且型別安全:
$resourceId = get_resource_id($resource);
Traits 改進中的抽象方法 rfc
Traits 可以指定必須由使用它們的類所實現的抽象方法。需要注意的是: 在 PHP 8 之前,尚未驗證這些方法已經實現的標識。以下內容有效:
trait Test {
abstract public function test(int $input): int;
}
class UsesTrait
{
use Test;
public function test($input)
{
return $input;
}
}
當使用 Traits 並實現其抽象方法時,PHP 8 將執行適當的方法進行標識驗證抽象方法是否確實被實現。這意味著您需要編寫以下程式碼:
class UsesTrait
{
use Test;
public function test(int $input): int
{
return $input;
}
}
token_get_all()
rfc 的物件實現
token_get_all()
函式返回一個值陣列,該 RFC 使用 PhpToken :: getAll()
方法新增了 PhpToken
類。此實現適用於物件而不是普通值。它消耗更少的記憶體,並且更易於閱讀。
可變語法調整
在 RFC 中:“統一變數語法 RFC 解決了 PHP 變數語法中的許多不一致之處。該 RFC 旨在解決一小部分被忽略的情況。”
內部函式的型別註解
許多人 投入 了為所有內部函式新增適當的型別註釋的工作。這是一個長期存在的問題,最終可以通過以前版本中對 PHP 所做的所有更改來解決。這意味著內部函式和方法將在反射中具有完整的型別資訊。
重大變化
如前所述:這是一個重大更新,因此會有重大變化。最好的辦法是檢視 升級 文件中所列的重大變化的完整列表。
許多這些突破性的更改在以前的 7.* 版本中已被棄用,因此如果你多年來一直保持 PHP 在最新狀態,升級到 PHP 8 應該沒那麼難。
一致的型別錯誤
之前版本在出現型別錯誤時,PHP 中的使用者定義函式已經會丟擲 TypeErrors
,但是內部函式不會這麼做,而是發出警告並返回 null
。從 PHP 8 開始,內部函式的行為已變得和使用者定義函式一致。
重新分類的引擎警告
許多以前僅觸發警告或通知的錯誤已轉換為適當的錯誤。以下警告已更改。
-
變數未定義:
Error
異常代替通知 -
陣列索引未定義:警告代替通知
-
除以零:
DivisionByZeroError
異常代替警告 -
嘗試新增 / 移除非物件的屬性 '% s' :
Error
異常代替警告 -
嘗試修改非物件的屬性 '% s' :
Error
異常代替警告 -
嘗試分配非物件的屬性 '% s' :
Error
異常代替警告 -
從空值建立預設物件:
Error
異常代替警告 -
嘗試獲取非物件的屬性 '% s' :警告代替通知
-
未定義的屬性:% s: