php8.7升級到php9.0.2?PHP 8,PHP 的一個新的大版本,預計将于2020年12月3日發布,這意味着将不會有 PHP 7.5 版本PHP8目前正處于非常活躍的開發階段,所以在接下來的幾個月裡,情況可能會發生很大的變化,我來為大家科普一下關于php8.7升級到php9.0.2?下面希望有你要的答案,我們一起來看看吧!
PHP 8,PHP 的一個新的大版本,預計将于2020年12月3日發布,這意味着将不會有 PHP 7.5 版本。PHP8目前正處于非常活躍的開發階段,所以在接下來的幾個月裡,情況可能會發生很大的變化。
在這篇文章中,我會維持一個最新的清單列表,列出預計會出現的新特性、性能提升和突破性的變化。由于 PHP 8 是一個新的大版本,因此您的代碼被破壞的可能性更高。如果您始終保持運行 PHP 的最新版本,那麼升級相對來說就會輕松很多,因為在7. *版本中,大多數重大更改均已棄用。
除重大更改外,PHP 8還帶來了一些不錯的新功能,比如說 JIT編譯器, 聯合類型, 屬性,以及更多。
從新特性開始,請記住 PHP8 仍處于活動開發階段,因此此列表将随着時間的推移而增長。
考慮到 PHP 動态語言類型的特性,現在很多情況下,聯合類型都是很有用的。聯合類型是兩個或者多個類型的集合,表示可以使用其中任何一個類型。
public function foo(Foo|Bar $input): int|float;
請注意,聯合類型中不包含 void,因為void 表示的含義是“根本沒有返回值”。 另外,可以使用 |null 或者現有的 ? 表示法來表示包含 nullable 的聯合體 :
public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;
JIT — just in time — 編譯器雖然不總是在 Web 請求的上下文中,但是有望顯着地提高性能。目前還沒有完成任何準确的基準測試,但是肯定會到來。
如果您想進一步了解JIT對PHP的作用,可以閱讀我寫過的另一篇文章此處。
屬性在其他語言中通常被稱為 注解 ,提供一種在無需解析文檔塊的情況下将元數據添加到類中的方法。
快速浏覽一下,這裡有一份來自 RFC 的屬性示例:
use AppAttributesExampleAttribute;
<<ExampleAttribute>>
class Foo
{
<<ExampleAttribute>>
public const FOO = 'foo';
<<ExampleAttribute>>
public $x;
<<ExampleAttribute>>
public function foo(<<ExampleAttribute>> $bar) { }
}
<<PhpAttribute>>
class ExampleAttribute
{
public $value;
public function __construct($value)
{
$this->value = $value;
}
}
如果您想深入了解屬性如何工作以及如何構建自己的屬性,您可以在此博客上閱讀有關深入屬性的信息。
盡管已經可以返回 self,但是 static 直到 PHP 8 才是有效的返回類型 。考慮到 PHP 具有動态類型的性質,此功能對于許多開發人員将非常有用。
class Foo
{
public function test(): static
{
return new static();
}
}
有人可能将其稱為必要的邪惡:mixed 類型讓許多人感覺十分混亂。然而,有一個很好的論據支持去實現它:缺少類型在 PHP 中會導緻很多情況:
因為上述原因,添加 mixed 類型是一件很棒的事兒。mixed 本身代表下列類型中的任一類型:
請注意,mixed 不僅僅可以用來作為返回類型,還可以用作參數和屬性類型。
另外,還需要注意,因為 mixed 類型已經包括了 null,因此 mixed 類型不可為空。下面的代碼會觸發緻命錯誤:
// 緻命錯誤:混合類型不能為空,null已經是混合類型的一部分。
function bar(): ?mixed {}
該RFC将throw從一個語句更改為一個表達式,這使得可以在很多新地方抛出異常:
$triggerError = fn () => throw new MyError();
$foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');
基于在 PHP 7.4 中新增的 弱引用 RFC,PHP 8 中新增了 WeakMaps(弱映射)的實現。 WeakMaps(弱映射)在保持對一些對象的引用的同時,并不會組織這些對象被垃圾回收機制處理 。
以ORM為例,它們通常實現保存對實體類的引用的緩存,從而提高實體類之間關聯的性能。 隻要緩存中存在對這些實體類的引用,那麼這些類就無法被垃圾回收機制回收,盡管除了緩存中,已經沒有别處再引用這些實體類,它們依然不會被垃圾處理機制處理。
如果這個緩存層使用了弱引用和弱映射,那麼 PHP 将會在這些實體類沒有任何其他引用時,對其進行垃圾回收。 尤其是對于 ORMs,它可以管理一個請求中的數百個(如果不是數千個)實體;弱映射可以提供一種更好的、對資源更友好的方式來處理這些對象。
下面是弱映射基本的例子,摘抄自 RFC :
class Foo
{
private WeakMap $cache;
public function getSomethingWithCaching(object $obj): object
{
return $this->cache[$obj]
??= $this->computeSomethingExpensive($obj);
}
}
一個很小但是很有用的新特性:現在可以在對象上使用 :: class ,而不必在對象上使用 get_class() ,它的工作方式跟 get_class() 相同。
$foo = new Foo();
var_dump($foo::class);
在PHP 8 之前,無論何時你想要捕獲一個異常,你都需要先将其存儲到一個變量中,不管這個變量你是否會用到。通過 Non-capturing catches 你可以忽略變量,所以替換下面的代碼:
try {
// Something goes wrong
} catch (MySpecialexception $exception) {
Log::error("Something went wrong");
}
你現在可以這麼做:
try {
// Something goes wrong
} catch (MySpecialException) {
Log::error("Something went wrong");
}
請注意,必須始終指定類型,不允許将 catch 留空,如果你想要捕獲所有類型的異常和錯誤,需要使用 Throwable 作為捕獲類型。
當調用函數時已經支持尾部逗号,但是參數列表中仍然缺少尾随逗号支持。現在PHP8中允許這樣做,這意味着您可以執行以下操作:
public function(
string $parameterA,
int $parameterB,
Foo $objectfoo,
) {
// …
}
你已經可以使用 DateTime::createFromImmutable($immutableDateTime) 從 DateTimeImmutable 對象創建一個 DateTime 對象, 而另一種方法則更加取巧。通過添加DateTime::createFromInterface()和DatetimeImmutable::createFromInterface()現在有一種通用的方法可以将DateTime和DatetimeImmutable對象相互轉換。
DateTime::createFromInterface(DateTimeInterface $other);
DateTimeImmutable::createFromInterface(DateTimeInterface $other);
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!