PHP8 新特性

2021-02-19 紅牛慕課

命名參數屬性構造函數屬性提升聯合類型Match 表達式Nullsafe 操作符更合理的字符串與數值的比較內置函數的一致錯誤類型JIT 編譯類型系統和錯誤處理的改進其他的語法微調和改進新類、接口、和函數

PHP 8.0.0 Released!

26 Nov 2020 PHP 開發組宣布 PHP 8.0.0 可用。

PHP 8.0 是 PHP 語言的主要更新。它包含了許多新特性和優化,包括命名參數、聯合類型、屬性、構造函數屬性提升、匹配表達式、nullsafe 操作符、JIT,以及對類型系統、錯誤處理和一致性的改進。

命名參數

Named arguments

PHP 7

htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

PHP 8

htmlspecialchars($string, double_encode: false);

只指定必需參數,跳過可選參數。

參數是獨立於順序並且是自描述的。

屬性

Attributes

屬性,在很多語言中亦稱作註解。

PHP 7

class PostsController
{
    /**
     * @Route("/api/posts/{id}", methods={"GET"})
     */
    public function get($id) { /* ... */ }
}

PHP 8

class PostsController
{
    #[Route("/api/posts/{id}", methods: ["GET"])]
    public function get($id) { /* ... */ }
}

不再使用 PHPDoc 注釋,現在可以使用 PHP 原生語法的結構化元數據。

構造函數屬性提升

Constructor property promotion

PHP 7

class Point {
  public float $x;
  public float $y;
  public float $z;

  public function __construct(
    float $x = 0.0,
    float $y = 0.0,
    float $z = 0.0
  ) {
    $this->x = $x;
    $this->y = $y;
    $this->z = $z;
  }
}

PHP 8

class Point {
  public function __construct(
    public float $x = 0.0,
    public float $y = 0.0,
    public float $z = 0.0,
  ) {}
}

定義和初始化屬性可使用更少的樣板代碼。

聯合類型

Union types

PHP 7

class Number {
  /** @var int|float */
  private $number;

  /**
   * @param float|int $number
   */
  public function __construct($number) {
    $this->number = $number;
  }
}

new Number('NaN'); // Ok

PHP 8

class Number {
  public function __construct(
    private int|float $number
  ) {}
}

new Number('NaN'); // TypeError

可使用聯合類型聲明在運行時驗證類型來代替使用 PHPDoc 注釋說明。

Match 表達式

Match expression

PHP 7

switch (8.0) {
  case '8.0':
    $result = "Oh no!";
    break;
  case 8.0:
    $result = "This is what I expected";
    break;
}
echo $result;
//> Oh no!

PHP 8

echo match (8.0) {
  '8.0' => "Oh no!",
  8.0 => "This is what I expected",
};
//> This is what I expected

match 類似於 switch,具有如下特性:

Nullsafe 操作符

Nullsafe operator

PHP 7

// PHP 7
$country =  null;

if ($session !== null) {
  $user = $session->user;

  if ($user !== null) {
    $address = $user->getAddress();

    if ($address !== null) {
      $country = $address->country;
    }
  }
}

PHP 8

// PHP 8
$country = $session?->user?->getAddress()?->country;

可使用 nullsafe 操作符完成鏈式調用來代替 null 的驗證。當對鏈中的一個元素求值失敗時,整個鏈的執行將中止,整個鏈的求值為 null。

更合理的字符串與數值的比較

Saner string to number comparisons

PHP 7

// PHP 7
0 == 'foobar' // true

PHP 8

// PHP 8
0 == 'foobar' // false

當數值與數值字符串比較時,PHP 8 使用數值比較。否則將數值轉換為字符串並採用字符串比較。

內置函數的一致錯誤類型

Consistent type errors for internal functions

PHP 7

// PHP 7
strlen([]); // Warning: strlen() expects parameter 1 to be string, array given

array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0

PHP 8

// PHP 8
strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given

array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0

大部分內置函數在參數驗證失敗後會拋出 Error 異常。

JIT 編譯

Just-In-Time compilation

PHP 8 引入了兩個 JIT 編譯引擎。Tracing JIT 是其中最有前景的,它在合成基準測試上的性能提高了3倍,在一些特定的長時間運行的應用程式上的性能提高了1.5-2倍。典型的應用程式性能與 PHP 7.4 相當。

(圖像來自,https://www.php.net/images/php8/scheme.svg)

類型系統和錯誤處理的改進

Type system and error handling improvements

算術/位操作中更嚴格的類型檢查 RFC

抽象 trait 方法驗證 RFC

魔術方法的正確籤名 RFC

重分類的引擎警告 RFC

不兼容方法籤名的致命錯誤 RFC

@ 操作符不在靜默致命錯誤。

私有方法的繼承 RFC

混合類型 RFC

靜態返回類型 RFC

內部函數 email_thread 的類型

用於代替 Curl, Gd, Sockets, OpenSSL, XMLWriter 和 XML 擴展資源的封裝對象

其他的語法微調和改進

Other syntax tweaks and improvements

新類、接口、和函數

New Classes, Interfaces, and Functions·

Weak Map 類

Stringable 接口

str_contains(), str_starts_with(), str_ends_with()

fdiv()

get_debug_type()

get_resource_id()

token_get_all() 對象實現

New DOM Traversal and Manipulation APIs

相關焦點

  • PHP8 新特性之 Attributes - php中文網
    PHP8的Alpha版本,過幾天就要發布了,其中包含了不少的新特性,當然我自己認為最重要的還是JIT,這個我從2013年開始參與,中間挫折無數,失敗無數後,終於要發布的東東。不過,今天呢,我不打算談JIT,等PHP8發布了以後,我再單獨寫個類似《深入理解PHP8之JIT》系列來說吧。
  • PHP 7.1 新特性一覽
    PHP 7.1 release版本發布在即,本文整理一下 7.1 中的一些新特性以供了解。所有內容均選自官方 RFC 文檔。
  • PHP7.0 的新特性
    PHP7.0 的新特性經常會被面試官問到,在平時的項目開發中運用它們也會提升一定的代碼質量和代碼運行性能,可見這個知識點的重要性。不過有很多人都沒有去系統的了解掌握,今天我剛好系統整理了一番分享出來。php declare(strict_types=1)//1:嚴格模式 0:強制模式(默認)classOrderServiceextendsBaseService{...
  • PHP接口特性的實例講解
    PHP接口特性的實例講解 如果你對於PHP接口特性還有些模糊,那麼我們可以通過對學習JAVA接口的知識,來說明PHP接口的一些相關知識。最近在看PHP的OOP特性,發現和JAVA很像,就是語法上有不同,但是有關資料少的可憐,找到了幾個也不能充分說明PHP接口特性,自己又看了一遍孫鑫老師的JAVA視頻教程,有關接口的部分,昨天總算是理解了。真的感覺是豁然開朗。把自己寫的PHP接口部分的示例程序發上來,讓大家對PHP接口特性有一個清晰的認識。
  • 原來PHP 8 都正式發布了
    php8的下載地址:https://www.php.net/downloads.phpPHP 8.0.0 目前是最新的主要版本,它引入了一些重大變更,以及許多新特性和性能優化,PHP 8.0 值得關注的改進包括以下:1、PHP 8.0 引入了備受期待的
  • PHP 8 Beta 2 發布,修復一個內存洩漏 bug
    PHP 8 Beta 2 已經發布,自從進入 Beta 階段,PHP 8 已進入特性凍結期,不會有特性上的變更。
  • 利用PHP的字符串解析特性Bypass
    "; flow:established,to_server; content:"/view.php?i="; http_uri; fast_pattern:only; pcre:"//view.php?
  • PHP 8.0正式發布:支持JIT編譯器,性能提升高達3倍
    PHP 8.0是PHP語言的最新主要版本,帶來了許多新特性和優化,包括命名參數(named arguments)、聯合類型(union types)、屬性(attributes)、構造器屬性提升(constructor property promotion)、Match表達式、nullsafe運算符、JIT,以及針對類型系統、錯誤處理和一致性的諸多改進。
  • 有安全研究者混入了 PHP 8.0 開發組!
    來源 | 代碼審計(ID:white-hat-note)經歷了近半年的alpha版本測試後,PHP在2020年11月26號正式發布了8.0版本:https://www.php.net/releases/8.0/en.php今天我們就來瀏覽一下PHP 8.0中出現的主要特性,以及它給我們安全研究人員帶來的挑戰。
  • 從PHP 5到PHP 7性能全評測(含未發布的JIT版PHP 8對比)
    導讀:PHP 是 Web 開發最常用的語言,每個大版本的更新都帶來不少新特性和性能提升。
  • PHP 5 到 PHP 7 性能評測(含 JIT 版 PHP 8 對比)
    導讀:PHP 是 Web 開發最常用的語言,每個大版本的更新都帶來不少新特性和性能提升。
  • PHP 8.0 正式版發布,性能提升 10%
    IT之家11月27日消息 恰逢一年一度感恩節,PHP 8.0 正式版現已正式開放下載。PHP 8.0 引入了 JIT編譯器特性,同時加入多種新的語言功能,例如命名參數、聯合類型、註解、Constructor Property Promotion、match 表達式、nullsafe 運算符以及對類型系統、錯誤處理和一致性的改進。下載地址:https://www.php.net/downloads.php
  • PHP7.3即將到來,快來了解一下新特性吧
    自從 PHP 7.0 發布以來,社區見證了許多新特性的誕生,極大地改進了開發者在項目中應用 PHP 的方式。提高 PHP 應用的性能和安全性,是這些改進的主要目的。PHP 最近實現了又一個裡程碑 —— 發布 PHP 7.3。新版本帶來了一些急需的更新。在本文中,我將論述新推出的 PHP 7.3 特性 和更新。
  • PHP7版本中有哪些新特性?
    PHP7版本中的新特性有哪些?一點PHP博客分享關於php7.0中的一些新特徵,在PHP7中由於修改了底層引擎大部分代碼,以及通過各種方式提高PHP的性能,所以在PHP7中也增加了一些新的語法,這些語法的使用也能對提高性能有幫助。
  • php怎麼了,又要涼涼了嗎
    1.中國年輕一代用得更多的旅遊網站2.上億旅行者共同打造的"旅行神器"3.60,000 多個全球旅遊目的地4.600,000 個細分目的地新玩法5.60,000,000 次攻略下載答案呼之即出,沒錯,是php,是php的敏捷開發讓這樣一個從此從創業過渡到了現在的大公司!三、php真的涼涼了嗎1、中小型公司的首選語言要說現在中小型公司的首選語言,我相信仍然是php,因為php的快速開發快速迭代早已深入人心。可能說到這裡,會有不少其他語言從業者來反駁博主。
  • 全方位解讀php8.0版本優化與改進
    除非你一直生活在一塊石頭下,或者生活在過去,否則你會意識到JIT正在進入PHP 8:投票今天悄然結束,絕大多數人贊成合併到PHP8,所以,這是正式的,本文全方位解讀php8.0版本優化與改進。PHP8 官宣《PHP8首個版本 Alpha1 發布!》
  • PHP如何刪除數組中的重複元素 - php中文網
    php$result1 = array("a" => "green", "red", "b" => "green", "blue", "red");var_dump($result1);$result2 = array_unique($result1);var_dump($result2
  • php異或計算繞過preg_match()
    原理以製作免殺馬為例:在製作免殺馬的過程,根據php的語言特性對字符進行!運算會將字符類型轉為bool類型,而bool類型遇到運算符號時,true會自動轉為數字1,false會自動轉為數字0,如果將bool類型進行計算,並使用chr()函數轉為字符,使用"."
  • CTF中常見的PHP漏洞小結
    : gzip, deflateAccept-Language: zh-CN,zh;q=0.8Connection: closepassword[]=admin文件包含漏洞include()require()include_once()require_once()這四個函數會將包含的文件作為php文件解析
  • PHPGrid 1.4.8 發布 PHP的CRUD框架
    PHPGrid 1.4.8 為收費用戶提供了 HTML 編輯器集成、FancyBox 集成以及從 phpArray 中加載表格數據、條件格式化和數據顯示等等。PhpGrid是為php開發人員提供強大,開源的CRUD(添加,顯示,刪除,修改)框架.