主頁(yè) > 知識(shí)庫(kù) > PHP 8新特性簡(jiǎn)介

PHP 8新特性簡(jiǎn)介

熱門(mén)標(biāo)簽:團(tuán)購(gòu)網(wǎng)站 銀行業(yè)務(wù) Mysql連接數(shù)設(shè)置 科大訊飛語(yǔ)音識(shí)別系統(tǒng) Linux服務(wù)器 電子圍欄 阿里云 服務(wù)器配置

PHP 8新特性

新的主要PHP版本PHP 8預(yù)計(jì)將于2020年底發(fā)布。它現(xiàn)在處于非常活躍的開(kāi)發(fā)階段,所以在接下來(lái)的幾個(gè)月里,事情可能會(huì)發(fā)生很大的變化。

在這篇文章中,我將持續(xù)更新預(yù)期的內(nèi)容列表:新特性、性能改進(jìn)和重大變化。因?yàn)镻HP 8是一個(gè)新的主版本,所以您的代碼被破壞的幾率更高。如果你一直在更新最新的版本,升級(jí)應(yīng)該不會(huì)太困難,因?yàn)榇蠖鄶?shù)有破壞性的更改在7之前就已經(jīng)廢棄了。*版本。

除了中斷更改之外,PHP 8還帶來(lái)了一些不錯(cuò)的新特性,比如JIT編譯器和union類(lèi)型;還有更多!

Union types:聯(lián)合類(lèi)型

考慮到PHP的動(dòng)態(tài)類(lèi)型化特性,在很多情況下聯(lián)合類(lèi)型是有用的。聯(lián)合類(lèi)型是兩個(gè)或多個(gè)類(lèi)型的集合,這些類(lèi)型表示其中一個(gè)可以使用。

public function foo(Foo|Bar $input): int|float;

注意,void永遠(yuǎn)不能是union類(lèi)型的一部分,因?yàn)樗硎尽案緵](méi)有返回值”。此外,可以使用|null來(lái)編寫(xiě)可為空的聯(lián)合,也可以使用現(xiàn)有的?符號(hào):

public function foo(Foo|null $foo): void;

public function bar(?Bar $bar): void;

JIT

即時(shí)編譯器承諾顯著的性能改進(jìn),盡管并不總是在web請(qǐng)求的上下文中。目前還沒(méi)有任何準(zhǔn)確的基準(zhǔn),但它們肯定會(huì)到來(lái)。

Static return type:靜態(tài)的返回類(lèi)型

雖然已經(jīng)可以返回self,但靜態(tài)類(lèi)型直到PHP 8才成為有效的返回類(lèi)型??紤]到PHP的動(dòng)態(tài)類(lèi)型特性,這一特性對(duì)許多開(kāi)發(fā)人員都很有用。

class Foo
{
  public function test(): static
  {
    return new static();
  }
}

Weak maps

在PHP 7.4中添加的weakrefs RFC的基礎(chǔ)上,在PHP 8中添加了WeakMap實(shí)現(xiàn)。弱映射包含對(duì)對(duì)象的引用,這并不會(huì)阻止那些對(duì)象被垃圾收集。

以orm為例,它們通常實(shí)現(xiàn)保存對(duì)實(shí)體類(lèi)的引用的緩存,以改進(jìn)實(shí)體之間關(guān)系的性能。這些實(shí)體對(duì)象不能被垃圾回收,只要這個(gè)緩存有一個(gè)對(duì)它們的引用,即使緩存是唯一引用它們的東西。

如果這個(gè)緩存層使用弱引用和映射,那么PHP將在沒(méi)有其他對(duì)象引用它們時(shí)對(duì)這些對(duì)象進(jìn)行垃圾收集。尤其是orm,它可以在一個(gè)請(qǐng)求中管理數(shù)百個(gè)(如果不是數(shù)千個(gè))實(shí)體;弱映射為處理這些對(duì)象提供了一種更好的、對(duì)資源更友好的方法。

下面是弱映射的樣子,一個(gè)來(lái)自RFC的例子:

class Foo 
{
  private WeakMap $cache;

  public function getSomethingWithCaching(object $obj): object
  {
    return $this->cache[$obj]
      ??= $this->computeSomethingExpensive($obj);
  }
}

::class on objects

一個(gè)小而有用的新特性:現(xiàn)在可以在對(duì)象上使用::class,而不必在對(duì)象上使用get_class()。它的工作方式與get_class()相同。

$foo = new Foo();

var_dump($foo::class);

Stringable interface

Stringable接口可用于鍵入提示任何字符串或?qū)崿F(xiàn)了 tostring()的內(nèi)容。而且,無(wú)論何時(shí)類(lèi)實(shí)現(xiàn)了 tostring(),它都會(huì)在后臺(tái)自動(dòng)實(shí)現(xiàn)接口,不需要手動(dòng)實(shí)現(xiàn)。

class Foo
{
  public function __toString(): string
  {
    return 'foo';
  }
}

function bar(Stringable $stringable) { /* … */ }

bar(new Foo());
bar('abc');

從接口創(chuàng)建DateTime對(duì)象

您已經(jīng)可以使用DateTime:: createfromimmutabledatetime ($immutableDateTime)從一個(gè)datetime對(duì)象創(chuàng)建一個(gè)DateTime對(duì)象,但是另一種方法比較麻煩。通過(guò)添加DateTime::createFromInterface()和datetime::createFromInterface(),現(xiàn)在就有了一種將DateTime和datetime對(duì)象相互轉(zhuǎn)換的通用方法。

DateTime::createFromInterface(DateTimeInterface $other);

DateTimeImmutable::createFromInterface(DateTimeInterface $other);

重新定義引擎的警告

許多以前只觸發(fā)警告或通知的錯(cuò)誤現(xiàn)在已經(jīng)轉(zhuǎn)換為正確的錯(cuò)誤。以下警告已更改。

  • Undefined variable: Error exception instead of notice
  • Undefined array index: warning instead of notice
  • Division by zero: DivisionByZeroError exception instead of warning
  • Attempt to increment/decrement property ‘%s' of non-object: Error exception instead of warning
  • Attempt to modify property ‘%s' of non-object: Error exception instead of warning
  • Attempt to assign property ‘%s' of non-object: Error exception instead of warning
  • Creating default object from empty value: Error exception instead of warning
  • Trying to get property ‘%s' of non-object: warning instead of notice
  • Undefined property: %s::$%s: warning instead of notice
  • Cannot add element to the array as the next element is already occupied: Error exception instead of warning
  • Cannot unset offset in a non-array variable: Error exception instead of warning
  • Cannot use a scalar value as an array: Error exception instead of warning
  • Only arrays and Traversables can be unpacked: TypeError exception instead of warning
  • Invalid argument supplied for foreach(): TypeError exception instead of warning
  • Illegal offset type: TypeError exception instead of warning
  • Illegal offset type in isset or empty: TypeError exception instead of warning
  • Illegal offset type in unset: TypeError exception instead of warning
  • Array to string conversion: warning instead of notice
  • Resource ID#%d used as offset, casting to integer (%d): warning instead of notice
  • String offset cast occurred: warning instead of notice
  • Uninitialized string offset: %d: warning instead of notice
  • Cannot assign an empty string to a string offset: Error exception instead of warning

以上就是PHP 8新特性簡(jiǎn)介的詳細(xì)內(nèi)容,更多關(guān)于php 8新特性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • 簡(jiǎn)述PHP7.4 新特性和廢棄的功能
  • php7新特性的理解和比較總結(jié)
  • PHP5.5新特性之yield理解與用法實(shí)例分析
  • php7函數(shù),聲明,返回值等新特性介紹
  • PHP新特性之字節(jié)碼緩存和內(nèi)置服務(wù)器
  • PHP新特性詳解之命名空間、性狀與生成器
  • PHP7新特性簡(jiǎn)述
  • php 7新特性之類(lèi)型申明詳解
  • 聊聊 PHP 8 新特性 Attributes

標(biāo)簽:江蘇 衡水 廣元 棗莊 大理 萍鄉(xiāng) 蚌埠 衢州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP 8新特性簡(jiǎn)介》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話(huà)咨詢(xún)

    • 400-1100-266