首頁 後端開發 PHP7 PHP 8 還有半年就要來了, 來看看有哪些新特性

PHP 8 還有半年就要來了, 來看看有哪些新特性

May 25, 2020 am 10:59 AM
php php8

PHP 8 還有半年就要來了, 來看看有哪些新特性

新的 PHP 主要版本 PHP8 預計 2020 年底發布。

它現在正處於非常活躍的開發中,所以在接下來的幾個月裡,開發速度和開發進程可能會有很大的變化。

在這篇文章中,我會羅列出 PHP8 中會發生的一些改變:新功能、效能改進和突破性變化。

因為 PHP8 是一個新的主要版本,所以程式碼及語法向下相容性會更低。

如果您一直保持與最新版本保持同步,那麼升級應該不會太難,因為大多數突破性的變更在 7.* 版本中都已棄用。

除了突破性的變化,PHP8 還帶來了一些不錯的新特性,例如 JIT 編譯器和 union types,當然還有其它更多的特性。

新功能

從新功能開始說起,但 PHP8 仍在積極開發中,因此這個清單將隨著時間的推移而成長。

聯合類型 (Union types) RFC

考慮到 PHP 的動態型別特性,聯合型別在許多情況下都很有用。

聯合類型是兩個或多個類型的集合,這些類型指示可以使用這兩個類型中的任何一個。

public function foo(Foo|Bar $input): int|float;
登入後複製

我怎麼感覺這個和 C 語言裡的聯合體有點相似。

請注意,void 永遠不能是聯合類型的一部分,因為它表示 「根本沒有回傳值」。

此外,可以使用 |NULL 或使用現有的? 。

public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;
登入後複製

JIT RFC

JIT-Just-In-Time 編譯器承諾顯著提高效能,儘管在 Web 應用可能沒有較大的好處。

在這一點上還沒有任何準確的基準,但它們肯定會出現的。

靜態回傳類型 (Static return type) RFC

#雖然已經可以回傳 self ,但在 PHP8 之前,靜態不是有效的回傳類型。考慮到 PHP 的動態類型特性,它對許多開發人員都很有用。

class Foo
{
    public function test(): static
    {
        return new static();
    }
}
登入後複製

弱映射 (Weak maps) RFC

#基於在 PHP 7.4 中新增的 WeakRefs RFC 的基礎上,在 PHP 8 中 新增了 WeakMap 實作。 WeakMap 包含對物件的引用,這不會阻止這些物件被垃圾回收。

以 ORM 為例,它們經常實作包含對實體類別的引用的緩存,以提高實體之間關係的效能。

這些實體物件不能被垃圾回收,只要該快取有對它們的引用,即使快取是唯一引用它們的東西。

如果該快取層改為使用弱引用和映射,則 PHP 將在其他物件不再引用這些物件時對它們進行垃圾回收。

特別是在ORM 的情況下,它可以在一個請求中管理數百個(如果不是數千個) 實體;弱映射可以提供一種更好、更資源友好的方式來處理這些對象。

以下是Weak maps 的用法,RFC 中的範例:

class Foo 
{
    private WeakMap $cache;
    public function getSomethingWithCaching(object $obj): object
    {
        return $this->cache[$obj]
           ??= $this->computeSomethingExpensive($obj);
    }
}
登入後複製

可以在物件上使用::class RFC

一個小而有用的新功能:現在可以對物件使用::class,而不必對它們使用get_class()。

它的運作方式與 get_class() 相同。

$foo = new Foo();
var_dump($foo::class);
登入後複製

建立 DateTime 物件的介面

您已經可以使用 DateTime::createFromImmutable($immutableDateTime),從 DateTimeImmutable 物件建立 DateTime 對象,但反過來又很棘手。

透過新增 DateTime::createFromInterface() 和 DatetimeImmutable::createFromInterface(),現在有了一種將 DateTime 和 DateTimeImmutable 物件相互轉換的通用方法。

DateTime::createFromInterface(DateTimeInterface $other);
DateTimeImmutable::createFromInterface(DateTimeInterface $other);
登入後複製

新的 Stringable 介面 RFC

Stringable 介面可用來鍵入提示任何字串或實作__toString()。

此外,每當類別實作__toString() 時,它都會自動在幕後實作接口,不需要手動實作它。

class Foo
{
    public function __toString(): string
    {
        return 'foo';
    }
}
function bar(Stringable $stringable) { /* … */ }
bar(new Foo());
bar('abc');
登入後複製

新的str_contains () 函數RFC

有些人可能會說這是早就應該實現的功能,但是我們最終不必再依賴​​strpos () 來知道一個字串是否包含另一個字串。

以前:

if (strpos('string with lots of words', 'words') !== false) { /* … */ }
登入後複製

現在:

if (str_contains('string with lots of words', 'words')) { /* … */ }
登入後複製

新的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 () 將會傳回類別名稱。

可以在 RFC 中找到 get_debug_type () 和 gettype () 之間差異的完整清單。

改進 traits 裡的抽象方法 RFC

traits 可以指定必須由使用它們的類別實現的抽象方法。

但有一個警告:在 PHP8 之前,這些方法實作的簽章沒有經過驗證。

在以下代码中有效:

trait Test {
    abstract public function test(int $input): int;
}
class UsesTrait
{
    use Test;
    public function test($input)
    {
        return $input;
    }
}
登入後複製

在使用 traits 并实现其抽象方法时,PHP8 将执行正确的方法签名验证。

这意味着您需要改写以下内容:

class UsesTrait
{
    use Test;
    public function test(int $input): int
    {
        return $input;
    }
}
登入後複製

token_get_all () 的对象接口 RFC

函数的作用是:返回值的是一个数组。

此 RFC 使用 PhpToken::getall () 方法添加一个 PhpToken 类。

此实现使用对象,而不是普通值。

它消耗更少的内存,更容易阅读。

变量语法调整 RFC

来自 RFC:“统一变量语法 RFC 解决了 PHP 变量语法中的一些不一致问题”,这个 RFC 打算解决少数被忽略的情况。

内部函数的类型批注

很多人都参与到为所有内部函数添加适当类型注释的工作中。

这是一个长期存在的问题,通过在以前版本中对 PHP 所做的所有更改,最终可以解决这个问题。

这意味着内部函数和方法在反射中将具有完整的类型信息。

统一错误类型 RFC

PHP 中的用户定义函数已经抛出 TypeErrors,但是内部函数没有抛出 TypeErrors,而是发出警告并返回 NULL。

从 PHP8 开始,内部函数的行为已经保持一致。

重新分类 zend engine 报错 RFC

许多以前只触发警告或通知的错误已转换为适当的错误。

以下警告已更改。

未定义变量:错误异常而不是通知。

未定义的数组索引:警告而不是通知。

被零除:DivisionByZeroError 异常而不是警告。

尝试递增 / 递减非对象的属性‘% s’:错误异常而不是警告。

试图修改非对象的属性‘% s’:错误异常而不是警告。

尝试分配非对象的属性‘% s’:错误异常而不是警告。

从空值创建默认对象:错误异常而不是警告。

正在尝试获取非对象的属性‘% s’:警告而不是通知。

未定义属性:% s::$% s:警告而不是通知。

无法将元素添加到数组,因为下一个元素已被占用:错误异常而不是警告。

无法取消设置非数组变量中的偏移量:错误异常而不是警告。

不能将标量值用作数组:错误异常而不是警告。

只能解包数组和遍历:TypeError 异常而不是警告。

为 foreach () 提供的参数无效:TypeError 异常而不是警告。

偏移类型非法:TypeError 异常而不是警告。

isset 中的偏移类型非法或为空:TypeError 异常而不是警告。

未设置中的偏移类型非法:TypeError 异常而不是警告。

数组到字符串的转换:警告而不是通知。

资源 ID#% d 用作偏移量,转换为整数 (% d):警告而不是通知。

发生字符串偏移量转换:警告而不是通知。

未初始化的字符串偏移量:% d:警告而不是通知。

无法将空字符串分配给字符串偏移量:错误异常而不是警告

默认错误报告级别

现在是 E_ALL,而不是除 E_NOTICE 和 E_DEVERATED 之外的所有内容。

这意味着可能会弹出许多以前被悄悄忽略的错误,尽管在 PHP8 之前可能已经存在。

@运算符不再忽略致命错误

此更改可能会揭示在 PHP8 之前隐藏的错误。请确保在生产服务器上设置 display_errors=off !

串联优先级 RFC

虽然在 PHP7.4 中已不推荐使用,但此更改现在生效。

如果你这样写的话:

echo "sum: " . $a + $b;
登入後複製

PHP 以前会这样解释它:

echo ("sum: " . $a) + $b;
登入後複製

PHP 8 将会这样解释它:

echo "sum: " . ($a + $b);
登入後複製

反射方法签名更改

反射类的三个方法签名已更改:

ReflectionClass::newInstance($args);
ReflectionFunction::invoke($args);
ReflectionMethod::invoke($object, $args);
登入後複製

现已成为:

ReflectionClass::newInstance(...$args);
ReflectionFunction::invoke(...$args);
ReflectionMethod::invoke($object, ...$args);
登入後複製

升级指南指定,如果您扩展了这些类,并且仍然希望同时支持 PHP 7 和 PHP 8,则允许以下签名:

ReflectionClass::newInstance($arg = null, ...$args);
ReflectionFunction::invoke($arg = null, ...$args);
ReflectionMethod::invoke($object, $arg = null, ...$args);
登入後複製

推荐教程:《PHP教程

以上是PHP 8 還有半年就要來了, 來看看有哪些新特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1272
29
C# 教程
1252
24
PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP的持久相關性:它還活著嗎? PHP的持久相關性:它還活著嗎? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python:代碼示例和比較 PHP和Python:代碼示例和比較 Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

See all articles