PHP 8 の新機能と大きな変更点
PHP の新しいメジャー バージョンである PHP 8 は、2020 年 12 月 3 日にリリースされる予定です。つまり、PHP 7.5 バージョンは存在しません。 PHP8 は現在非常に活発な開発段階にあるため、今後数か月で状況が大きく変わる可能性があります。
この記事では、予想される新機能、パフォーマンスの向上、重大な変更の最新リストを維持します。 PHP 8 は新しい大きなバージョンであるため、コードが破損する可能性が高くなります。常に最新バージョンの PHP を実行している場合、ほとんどの重大な変更は 7.* バージョンで非推奨になっているため、アップグレードは比較的簡単です。
大きな変更に加えて、PHP 8 には、JIT コンパイラー、共用体型、プロパティなどのいくつかの優れた新機能も導入されています。
新機能
まず新機能から始めますが、PHP8 はまだ開発中であるため、このリストは時間の経過とともに増加することを覚えておいてください。
共用体型
PHP 動的言語型の特性を考慮すると、現在、共用体型は多くの状況で非常に役立ちます。共用体型は 2 つ以上の型のコレクションであり、いずれかの型を使用できることを示します。
public function foo(Foo|Bar $input): int|float;
void
は「戻り値がまったくない」ことを意味するため、ユニオン型には含まれないことに注意してください。あるいは、nullable
を含む共用体は、|null
または既存の ?
表記を使用して表すことができます: <pre class="brush:php;toolbar:false">public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;</pre>
JIT — ジャストインタイム — コンパイラーは、常に Web リクエストのコンテキストにあるわけではありませんが、パフォーマンスを大幅に向上させることが期待されています。正確なベンチマークはまだ行われていませんが、確実に実現されるでしょう。
PHP における JIT の役割について詳しく知りたい場合は、ここで私が書いた別の記事を読んでください。
属性属性は、他の言語では
注釈と呼ばれることが多く、ドキュメント ブロックを解析せずにメタデータをドキュメントに転送する方法を提供します。 . クラスにメソッドが追加されました。 簡単に見てみるために、RFC のプロパティの例を次に示します。
use App\Attributes\ExampleAttribute; <<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; } }
プロパティがどのように機能するか、独自のプロパティを構築する方法について詳しく知りたい場合は、次の記事を参照してください。このブログの属性情報の深さ。
新しいstatic 戻り値の型
すでに
self を返すことも可能ですが、static
PHP 8 が唯一の有効な戻り値の型になるまで。 PHP の動的に型指定される性質を考慮すると、この機能は多くの開発者にとって非常に役立ちます。 <pre class="brush:php;toolbar:false">class Foo
{
public function test(): static
{
return new static();
}
}</pre>
mixed Type
これを必要悪と呼ぶ人もいるかもしれません:
mixed Type は多くの人を作ります それはとても感じます混乱する。ただし、実装を支持する良い議論があります。型が欠落していると、PHP で多くの状況が発生します。
- 関数が何も返さない、または null を返す
- 必要なのは、PHP でタイプヒントできない型です
- For上記の理由から、
タイプを追加することは素晴らしいことです。 mixed
自体は、次のいずれかの型を表します:
- array
- bool
-
##int -
float ##null
-
オブジェクト
リソース
文字列
-
は戻り値の型としてだけでなく、パラメーターやプロパティの型としても使用できます。次のことに注意してください
mixed
mixed 型にはすでに
null
mixed 型を空にすることはできないことに注意する必要があります。次のコードは致命的エラーを引き起こします:
// 致命错误:混合类型不能为空,null已经是混合类型的一部分。 function bar(): ?mixed {}
throw
式
この RFC のステートメントからの throw
の変更は次のとおりです。多くの新しい場所で例外をスローできる式: $triggerError = fn () => throw new MyError();
$foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');
弱いマッピング
WeakMaps (弱いマッピング) は 8 で追加されました。 WeakMaps
(弱いマッピング) は、一部のオブジェクトへの参照を維持し、これらのオブジェクトがガベージ コレクション メカニズムによって処理されるのを妨げません。ORM を例に挙げると、通常、ORM はエンティティ クラスへの参照を保存するキャッシュを実装し、それによってエンティティ クラス間の関連付けのパフォーマンスを向上させます。キャッシュ内にこれらのエンティティ クラスへの参照がある限り、これらのクラスはガベージ コレクション メカニズムによってリサイクルできません。これらのエンティティ クラスはキャッシュ以外の場所で参照されなくなりましたが、ガベージ コレクション メカニズムによって処理されることはありません。 。
如果这个缓存层使用了弱引用和弱映射,那么 PHP 将会在这些实体类没有任何其他引用时,对其进行垃圾回收。 尤其是对于 ORMs,它可以管理一个请求中的数百个(如果不是数千个)实体;弱映射可以提供一种更好的、对资源更友好的方式来处理这些对象。
下面是弱映射基本的例子,摘抄自 RFC :
class Foo { private WeakMap $cache; public function getSomethingWithCaching(object $obj): object { return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj); } }
允许对对象使用 ::class
一个很小但是很有用的新特性:现在可以在对象上使用 :: class
,而不必在对象上使用 get_class()
,它的工作方式跟 get_class()
相同。
$foo = new Foo(); var_dump($foo::class);
Non-capturing catches
在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
对象
你已经可以使用 DateTime::createFromImmutable($immutableDateTime)
从 DateTimeImmutable
对象创建一个 DateTime
对象, 而另一种方法则更加取巧。通过添加DateTime::createFromInterface()
和DatetimeImmutable::createFromInterface()
现在有一种通用的方法可以将DateTime
和DatetimeImmutable
对象相互转换。
DateTime::createFromInterface(DateTimeInterface $other); DateTimeImmutable::createFromInterface(DateTimeInterface $other);
新增 Stringable
接口
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')) { /* … */ }
新增 str_starts_with()
和 str_ends_with()
函数
这是另外两个早该出现的函数,现在已在核心函数中添加了这两个函数。
str_starts_with('haystack', 'hay'); // true str_ends_with('haystack', 'stack'); // true
新增 fp()
函数
新的fp()
函数的作用类似于fmod()
和intp()
函数,它们可以除以0。视情况而定,将得到INF
,-INF
或NAN
。
新增 get_debug_type()
函数
get_debug_type()
返回变量的类型,听起来好像跟 gettype()
的作用一样啊?get_debug_type()
可以为数组,字符串,匿名类和对象返回更有用的输出信息。
例如,在类\ Foo \ Bar
上调用gettype()
将返回object
,而使用get_debug_type()
将返回类名。
如下表:
値 | get_debug_type() | gettype() |
---|---|---|
0 | int | integer |
0.1 | float | double |
true | bool | boolean |
false | bool | boolean |
文字列 | ||
配列 | ||
null | NULL | |
Foo\Bar | オブジェクト | |
class@anonymous | オブジェクト | |
リソース (xxx) | リソース | |
リソース (終了) |
以上がPHP 8 の新機能と大きな変更点の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

phpisStillRelevantinModernenterpriseenvironments.1.modernphp(7.xand8.x)は、パフォーマンスゲイン、stricttyping、jit compilation、andmodernsyntaxを提供し、scaleApplications.2.phpintegrateSeffeCtiveTiveliveTiveliveTiveliveTiveTiveTiveliveTiveStures、

n 1クエリの問題を避け、関連するデータを事前にロードすることにより、データベースクエリの数を減らします。 2.必要なフィールドのみを選択して、メモリと帯域幅を保存するために完全なエンティティをロードしないようにします。 3. DoctrineのセカンダリキャッシュやRedis Cacheの高周波クエリ結果など、キャッシュ戦略を合理的に使用します。 4.エンティティのライフサイクルを最適化し、クリア()を定期的に呼び出してメモリを解放してメモリオーバーフローを防ぎます。 5.データベースインデックスが存在し、生成されたSQLステートメントを分析して、非効率的なクエリを避けます。 6.変更が不要なシナリオで自動変更追跡を無効にし、パフォーマンスを改善するためにアレイまたは軽量モードを使用します。 ORMを正しく使用するには、SQLモニタリング、キャッシュ、バッチ処理、適切な最適化を組み合わせて、開発効率を維持しながらアプリケーションのパフォーマンスを確保する必要があります。

柔軟なPHPマイクロサービスを構築するには、RabbitMQを使用して非同期通信を実現する必要があります。 2。信頼性を確保するために、永続的なキュー、永続的なメッセージ、リリース確認、手動ACKを構成します。 3.指数バックオフ再試行、TTL、およびデッドレターキューセキュリティ処理の障害を使用します。 4.監督などのツールを使用して、消費者プロセスを保護し、ハートビートメカニズムを有効にしてサービスの健康を確保します。そして最終的に、システムが障害で継続的に動作する能力を実現します。

subprocess.run()を使用して、シェルコマンドを安全に実行し、出力をキャプチャします。注入リスクを避けるために、リストのパラメーターを渡すことをお勧めします。 2。シェル特性が必要な場合は、シェル= trueを設定できますが、コマンドインジェクションに注意してください。 3. subprocess.popenを使用して、リアルタイム出力処理を実現します。 4。Check = COMMATが失敗したときに例外をスローするためにtrueを設定します。 5.単純なシナリオで直接チェーンを呼び出して出力を取得できます。 os.system()または非推奨モジュールの使用を避けるために、日常生活の中でsubprocess.run()を優先する必要があります。上記の方法は、Pythonでシェルコマンドを実行するコアの使用を上書きします。

readonlypropertiesinphp8.2canonlybeassignedonedonedontheconstructoraturatiddeclaration andcannotBemodifiedifiedifiedifiedifiedifiedifiedifiadtivedabilityattthelanguagelele.2.

settings.jsonファイルは、ユーザーレベルまたはワークスペースレベルのパスにあり、VSCODE設定のカスタマイズに使用されます。 1。ユーザーレベルのパス:WindowsはC:\ users \\ appdata \ roaming \ code \ user \ settings.json、macos is/users //settings.json、linux is /home/.config/code/user/settings.json; 2。Workspace-Level Path:.vscode/settings Project Root Directoryの設定

正しいPHP Basicイメージを使用し、安全で最適化されたDocker環境を構成することが、生産を実現するための鍵です。 1.攻撃面を減らしてパフォーマンスを向上させるための基本画像としてPHP:8.3-fpm-alpineを選択します。 2.カスタムPHP.iniを介して危険な機能を無効にし、エラーディスプレイをオフにし、OpCacheとJITを有効にしてセキュリティとパフォーマンスを強化します。 3. NGINXを逆プロキシとして使用して、機密ファイルへのアクセスを制限し、PHPリクエストをPHP-FPMに正しく転送します。 4.マルチステージ最適化画像を使用して開発依存関係を削除し、非ルートユーザーを設定してコンテナを実行します。 5. CRONなどの複数のプロセスを管理するためのオプションの監督。 6.展開前に機密情報漏れがないことを確認します

BREFにより、PHP開発者は、サーバーを管理せずにスケーラブルで費用対効果の高いアプリケーションを構築できます。 1.Brefは、最適化されたPHPランタイムレイヤーを提供し、PHP8.3およびその他のバージョンをサポートし、LaravelやSymfonyなどのフレームワークとシームレスに統合することにより、PHPをAwslambdaにもたらします。 2。展開手順には、次のものが含まれます。Composerを使用してBREFのインストール、httpエンドポイントや職人コマンドなどの関数とイベントを定義するためにserverless.ymlの構成。 3. serverlessdeployコマンドを実行して、展開を完了し、Apigatewayを自動的に構成し、アクセスURLを生成します。 4。Lambdaの制限については、Brefは解決策を提供します。
