日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

php8更新,PHP 8 中新特性以及重大调整

發(fā)布時(shí)間:2023/12/1 php 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php8更新,PHP 8 中新特性以及重大调整 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

PHP 8,PHP 的一個(gè)新的大版本,預(yù)計(jì)將于2020年12月3日發(fā)布,這意味著將不會(huì)有 PHP 7.5 版本。PHP8目前正處于非常活躍的開發(fā)階段,所以在接下來的幾個(gè)月里,情況可能會(huì)發(fā)生很大的變化。

在這篇文章中,我會(huì)維持一個(gè)最新的清單列表,列出預(yù)計(jì)會(huì)出現(xiàn)的新特性、性能提升和突破性的變化。由于 PHP 8 是一個(gè)新的大版本,因此您的代碼被破壞的可能性更高。如果您始終保持運(yùn)行 PHP 的最新版本,那么升級(jí)相對(duì)來說就會(huì)輕松很多,因?yàn)樵?. *版本中,大多數(shù)重大更改均已棄用。

除重大更改外,PHP 8還帶來了一些不錯(cuò)的新功能,比如說 JIT編譯器, 聯(lián)合類型, 屬性,以及更多。

新特性

從新特性開始,請(qǐng)記住 PHP8 仍處于活動(dòng)開發(fā)階段,因此此列表將隨著時(shí)間的推移而增長(zhǎng)。

聯(lián)合類型

考慮到 PHP 動(dòng)態(tài)語言類型的特性,現(xiàn)在很多情況下,聯(lián)合類型都是很有用的。聯(lián)合類型是兩個(gè)或者多個(gè)類型的集合,表示可以使用其中任何一個(gè)類型。public function foo(Foo|Bar $input): int|float;

請(qǐng)注意,聯(lián)合類型中不包含 void,因?yàn)関oid 表示的含義是“根本沒有返回值”。 另外,可以使用 |null 或者現(xiàn)有的 ? 表示法來表示包含 nullable 的聯(lián)合體 :public function foo(Foo|null $foo): void;

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

JIT

JIT — just in time — 編譯器雖然不總是在 Web 請(qǐng)求的上下文中,但是有望顯著地提高性能。目前還沒有完成任何準(zhǔn)確的基準(zhǔn)測(cè)試,但是肯定會(huì)到來。

如果您想進(jìn)一步了解JIT對(duì)PHP的作用,可以閱讀我寫過的另一篇文章此處。

屬性

屬性在其他語言中通常被稱為 注解 ,提供一種在無需解析文檔塊的情況下將元數(shù)據(jù)添加到類中的方法。

快速瀏覽一下,這里有一份來自 RFC 的屬性示例:use App\Attributes\ExampleAttribute;

<>

class Foo

{

<>

public const FOO = 'foo';

<>

public $x;

<>

public function foo(<> $bar) { }

}<>

class ExampleAttribute

{

public $value;

public function __construct($value)

{

$this->value = $value;

}

}

如果您想深入了解屬性如何工作以及如何構(gòu)建自己的屬性,您可以在此博客上閱讀有關(guān)深入屬性的信息。

新增 static 返回類型

盡管已經(jīng)可以返回 self,但是 static 直到 PHP 8 才是有效的返回類型 。考慮到 PHP 具有動(dòng)態(tài)類型的性質(zhì),此功能對(duì)于許多開發(fā)人員將非常有用。class Foo

{

public function test(): static

{

return new static();

}

}

新增 mixed 類型

有人可能將其稱為必要的邪惡:mixed 類型讓許多人感覺十分混亂。然而,有一個(gè)很好的論據(jù)支持去實(shí)現(xiàn)它:缺少類型在 PHP 中會(huì)導(dǎo)致很多情況:函數(shù)不返回任何內(nèi)容或返回空值

我們需要多種類型的一種類型

我們需要的是PHP中不能進(jìn)行類型提示的類型

因?yàn)樯鲜鲈?#xff0c;添加 mixed 類型是一件很棒的事兒。mixed 本身代表下列類型中的任一類型:array

bool

callable

int

float

null

object

resource

string

請(qǐng)注意,mixed 不僅僅可以用來作為返回類型,還可以用作參數(shù)和屬性類型。

另外,還需要注意,因?yàn)?mixed 類型已經(jīng)包括了 null,因此 mixed 類型不可為空。下面的代碼會(huì)觸發(fā)致命錯(cuò)誤:// 致命錯(cuò)誤:混合類型不能為空,null已經(jīng)是混合類型的一部分。

function bar(): ?mixed {}

throw 表達(dá)式

該RFC將throw從一個(gè)語句更改為一個(gè)表達(dá)式,這使得可以在很多新地方拋出異常:$triggerError = fn () => throw new MyError();

$foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');

弱映射

基于在 PHP 7.4 中新增的 弱引用 RFC,PHP 8 中新增了 WeakMaps(弱映射)的實(shí)現(xiàn)。 WeakMaps(弱映射)在保持對(duì)一些對(duì)象的引用的同時(shí),并不會(huì)組織這些對(duì)象被垃圾回收機(jī)制處理 。

以O(shè)RM為例,它們通常實(shí)現(xiàn)保存對(duì)實(shí)體類的引用的緩存,從而提高實(shí)體類之間關(guān)聯(lián)的性能。 只要緩存中存在對(duì)這些實(shí)體類的引用,那么這些類就無法被垃圾回收機(jī)制回收,盡管除了緩存中,已經(jīng)沒有別處再引用這些實(shí)體類,它們依然不會(huì)被垃圾處理機(jī)制處理。

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

下面是弱映射基本的例子,摘抄自 RFC :class Foo

{

private WeakMap $cache;

public function getSomethingWithCaching(object $obj): object

{

return $this->cache[$obj]

??= $this->computeSomethingExpensive($obj);

}

}

允許對(duì)對(duì)象使用 ::class

一個(gè)很小但是很有用的新特性:現(xiàn)在可以在對(duì)象上使用 :: class ,而不必在對(duì)象上使用 get_class() ,它的工作方式跟 get_class() 相同。$foo = new Foo();

var_dump($foo::class);

Non-capturing catches

在PHP 8 之前,無論何時(shí)你想要捕獲一個(gè)異常,你都需要先將其存儲(chǔ)到一個(gè)變量中,不管這個(gè)變量你是否會(huì)用到。通過 Non-capturing catches 你可以忽略變量,所以替換下面的代碼:try {

// Something goes wrong

} catch (MySpecialException $exception) {

Log::error("Something went wrong");

}

你現(xiàn)在可以這么做:try {

// Something goes wrong

} catch (MySpecialException) {

Log::error("Something went wrong");

}

請(qǐng)注意,必須始終指定類型,不允許將 catch 留空,如果你想要捕獲所有類型的異常和錯(cuò)誤,需要使用 Throwable 作為捕獲類型。

參數(shù)列表中的尾部逗號(hào)

當(dāng)調(diào)用函數(shù)時(shí)已經(jīng)支持尾部逗號(hào),但是參數(shù)列表中仍然缺少尾隨逗號(hào)支持。現(xiàn)在PHP8中允許這樣做,這意味著您可以執(zhí)行以下操作:public function(

string $parameterA,

int $parameterB,

Foo $objectfoo,

) {

// …

}

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

你已經(jīng)可以使用 DateTime::createFromImmutable($immutableDateTime) 從 DateTimeImmutable 對(duì)象創(chuàng)建一個(gè) DateTime 對(duì)象, 而另一種方法則更加取巧。通過添加DateTime::createFromInterface()和DatetimeImmutable::createFromInterface()現(xiàn)在有一種通用的方法可以將DateTime和DatetimeImmutable對(duì)象相互轉(zhuǎn)換。DateTime::createFromInterface(DateTimeInterface $other);

DateTimeImmutable::createFromInterface(DateTimeInterface $other);

新增 Stringable接口

Stringable接口可用于鍵入提示任何字符串或?qū)崿F(xiàn)__ toString()的內(nèi)容。此外,每當(dāng)一個(gè)類實(shí)現(xiàn)__ toString()時(shí),它就會(huì)自動(dòng)實(shí)現(xiàn)后臺(tái)接口,而無需手動(dòng)實(shí)現(xiàn)。class Foo

{

public function __toString(): string

{

return 'foo';

}

}

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

bar(new Foo());

bar('abc');

新增 str_contains() 函數(shù) rfc

有些人可能會(huì)說這是早該發(fā)生的,但我們最終不必再依賴strpos來知道一個(gè)字符串是否包含另一個(gè)字符串。

無需這樣做:if (strpos('string with lots of words', 'words') !== false) { /* … */ }

你可以這樣做:if (str_contains('string with lots of words', 'words')) { /* … */ }

新增 str_starts_with() 和 str_ends_with() 函數(shù)

這是另外兩個(gè)早該出現(xiàn)的函數(shù),現(xiàn)在已在核心函數(shù)中添加了這兩個(gè)函數(shù)。str_starts_with('haystack', 'hay'); // true

str_ends_with('haystack', 'stack'); // true

新增 fp() 函數(shù)

新的fp()函數(shù)的作用類似于fmod()和intp()函數(shù),它們可以除以0。視情況而定,將得到INF,-INF或NAN。

新增 get_debug_type() 函數(shù)

get_debug_type()返回變量的類型,聽起來好像跟 gettype() 的作用一樣啊?get_debug_type() 可以為數(shù)組,字符串,匿名類和對(duì)象返回更有用的輸出信息。

例如,在類\ Foo \ Bar上調(diào)用gettype()將返回object,而使用get_debug_type()將返回類名。

如下表:Valueget_debug_type()gettype()0intinteger

0.1floatdouble

trueboolboolean

falseboolboolean

“hello”string

[]array

nullnullNULL

A class with name “Foo\Bar”Foo\Barobject

An anonymous classclass@anonymousobject

A resourceresource (xxx)resource

A closed resourceresource (closed)

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

新增 get_resource_id() 函數(shù)

資源是PHP中的特殊變量,指的是外部資源。一個(gè)示例是MySQL連接,另一個(gè)是文件句柄。

這些資源中的每一個(gè)都分配有一個(gè)ID,然而在這之前,如果想獲取某資源的ID,唯一方法是將資源轉(zhuǎn)換為int:$resourceId = (int) $resource;

PHP 8添加了get_resource_id()函數(shù),使此操作更加明顯且類型安全:$resourceId = get_resource_id($resource);

Traits 改進(jìn)中的抽象方法

Traits 可以指定必須由使用它們的類所實(shí)現(xiàn)的抽象方法。需要注意的是: 在 PHP 8 之前,尚未驗(yàn)證這些方法已經(jīng)實(shí)現(xiàn)的標(biāo)識(shí)。以下內(nèi)容有效:trait Test {

abstract public function test(int $input): int;

}

class UsesTrait

{

use Test;

public function test($input)

{

return $input;

}

}

當(dāng)使用 Traits 并實(shí)現(xiàn)其抽象方法時(shí),PHP 8將執(zhí)行適當(dāng)?shù)姆椒ㄟM(jìn)行標(biāo)識(shí)驗(yàn)證抽象方法是否確實(shí)被實(shí)現(xiàn)。這意味著您需要編寫以下代碼:class UsesTrait

{

use Test;

public function test(int $input): int

{

return $input;

}

}

token_get_all() rfc的對(duì)象實(shí)現(xiàn)

token_get_all()函數(shù)返回一個(gè)值數(shù)組,該RFC使用PhpToken :: getAll()方法新增了PhpToken類。此實(shí)現(xiàn)適用于對(duì)象而不是普通值。它消耗更少的內(nèi)存,并且更易于閱讀。

可變語法調(diào)整

在RFC中:“統(tǒng)一變量語法RFC解決了PHP變量語法中的許多不一致之處。該RFC旨在解決一小部分被忽略的情況。”

內(nèi)部函數(shù)的類型注解

許多人 投入 了為所有內(nèi)部函數(shù)添加適當(dāng)?shù)念愋妥⑨尩墓ぷ鳌_@是一個(gè)長(zhǎng)期存在的問題,最終可以通過以前版本中對(duì)PHP所做的所有更改來解決。這意味著內(nèi)部函數(shù)和方法將在反射中具有完整的類型信息。

重大變化

如前所述:這是一個(gè)重大更新,因此會(huì)有重大變化。最好的辦法是查看 升級(jí) 文檔中所列的重大變化的完整列表。

許多這些突破性的更改在以前的 7.* 版本中已被棄用,因此如果你多年來一直保持 PHP 在最新狀態(tài),升級(jí)到 PHP 8 應(yīng)該沒那么難。

一致的類型錯(cuò)誤 rfc

之前版本在出現(xiàn)類型錯(cuò)誤時(shí),PHP 中的用戶定義函數(shù)已經(jīng)會(huì)拋出 TypeErrors,但是內(nèi)部函數(shù)不會(huì)這么做,而是發(fā)出警告并返回 null。從 PHP 8 開始,內(nèi)部函數(shù)的行為已變得和用戶定義函數(shù)一致。

重新分類的引擎警告 rfc

許多以前僅觸發(fā)警告或通知的錯(cuò)誤已轉(zhuǎn)換為適當(dāng)?shù)腻e(cuò)誤。以下警告已更改。變量未定義:Error 異常代替通知

數(shù)組索引未定義:警告代替通知

除以零:pisionByZeroError 異常代替警告

嘗試添加/移除非對(duì)象的屬性 '%s' :Error 異常代替警告

嘗試修改非對(duì)象的屬性 '%s' :Error 異常代替警告

嘗試分配非對(duì)象的屬性 '%s' :Error 異常代替警告

從空值創(chuàng)建默認(rèn)對(duì)象:Error 異常代替警告

嘗試獲取非對(duì)象的屬性 '%s' :警告代替通知

未定義的屬性:%s::$%s:警告代替通知

無法添加元素到數(shù)組,因?yàn)橄乱粋€(gè)元素已被占用:Error 異常代替警告

無法在非數(shù)組變量中銷毀偏移量:Error 異常代替警告

無法將標(biāo)量值用作數(shù)組:Error 異常代替警告

只有數(shù)組和 Traversables 可以被解包:TypeError 異常代替警告

為 foreach() 提供了無效的參數(shù):TypeError 異常代替警告

偏移量類型非法:TypeError 異常代替警告

isset 或 empty 中的偏移量類型非法:TypeError 異常代替警告

unset 中的偏移量類型非法:TypeError 異常代替警告

數(shù)組到字符串的轉(zhuǎn)換:警告代替通知

資源 ID#%d 用作偏移量,轉(zhuǎn)換為整數(shù) (%d):警告代替通知

發(fā)生字符串偏移量轉(zhuǎn)換:警告代替通知

未初始化的字符串偏移量:%d:警告代替通知

無法將空字符串分配給字符串偏移量:Error 異常代替警告

提供的資源不是有效的流資源:TypeError 異常代替警告

@ 運(yùn)算符不再使致命錯(cuò)誤不提醒

此更改可能會(huì)使 PHP 8 之前的版本被 @ 隱藏的錯(cuò)誤再次顯示出來。請(qǐng)確保在生產(chǎn)服務(wù)器上設(shè)置了 display_errors=Off !

默認(rèn)錯(cuò)誤報(bào)告級(jí)別

現(xiàn)在的默認(rèn)錯(cuò)誤報(bào)告級(jí)別是 E_ALL 而不是之前的除 E_NOTICE 和 E_DEPRECATED 的所有內(nèi)容。這意味著可能會(huì)彈出許多錯(cuò)誤,這些錯(cuò)誤以前曾被忽略,盡管在 PHP 8 之前的版本中可能已經(jīng)存在。

默認(rèn) PDO 錯(cuò)誤模式 rfc

根據(jù)RFC:當(dāng)前 PDO 的默認(rèn)錯(cuò)誤模式為靜默。這意味著當(dāng)出現(xiàn) SQL 錯(cuò)誤時(shí),除非開發(fā)人員實(shí)現(xiàn)了自己的顯式錯(cuò)誤處理,否則不會(huì)發(fā)出任何錯(cuò)誤或警告,也不會(huì)引發(fā)任何異常。

此 RFC 將在 PHP 8 中將默認(rèn) PDO 錯(cuò)誤模式 改為PDO::ERRMODE_EXCEPTION 。

串聯(lián)優(yōu)先級(jí) rfc

在 PHP 7.4 中已廢棄的同時(shí),此變更開始生效。如果你像這樣子書寫:echo "sum: " . $a + $b;

PHP 以前會(huì)如是理解:echo ("sum: " . $a) + $b;

PHP 8 將這么做故理解為此:echo "sum: " . ($a + $b);

更嚴(yán)格的算術(shù)和位運(yùn)算類型檢查

PHP 8 以前,算術(shù)或位運(yùn)算符用于數(shù)組、資源或?qū)ο笫强山邮艿摹,F(xiàn)在不再可接受,并會(huì)拋出一個(gè) 類型錯(cuò)誤 :[] % [42];

$object + 4;

反射方法簽名變更

反射類的 3 個(gè)方法簽名已變更:ReflectionClass::newInstance($args);

ReflectionFunction::invoke($args);

ReflectionMethod::invoke($object, $args);

現(xiàn)在已變成:ReflectionClass::newInstance(...$args);

ReflectionFunction::invoke(...$args);

ReflectionMethod::invoke($object, ...$args);

升級(jí)指南指定,如果要擴(kuò)展這些類,并且仍想同時(shí)支持 PHP 7 和 PHP 8,則允許以下簽名:ReflectionClass::newInstance($arg = null, ...$args);

ReflectionFunction::invoke($arg = null, ...$args);

ReflectionMethod::invoke($object, $arg = null, ...$args);

幾個(gè)棄用

在PHP 7. * 的開發(fā)期間,添加了幾個(gè)棄用版本,這些棄用已于 PHP 8 最終確定。PHP 7.2 中的棄用

PHP 7.3 中的棄用

PHP 7.4 中的棄用

總結(jié)

以上是生活随笔為你收集整理的php8更新,PHP 8 中新特性以及重大调整的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。