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
または既存の ?
表記を使用して表すことができます: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;</pre><div class="contentsignin">ログイン後にコピー</div></div>
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
PHP 8 が唯一の有効な戻り値の型になるまで。 PHP の動的に型指定される性質を考慮すると、この機能は多くの開発者にとって非常に役立ちます。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">class Foo
{
public function test(): static
{
return new static();
}
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
これを必要悪と呼ぶ人もいるかもしれません: Type は多くの人を作ります それはとても感じます混乱する。ただし、実装を支持する良い議論があります。型が欠落していると、PHP で多くの状況が発生します。
タイプを追加することは素晴らしいことです。 mixed
自体は、次のいずれかの型を表します:
##null
オブジェクト
リソース
文字列
次のことに注意してください
mixed
mixed 型にはすでに
null
mixed 型を空にすることはできないことに注意する必要があります。次のコードは致命的エラーを引き起こします:
// 致命错误:混合类型不能为空,null已经是混合类型的一部分。 function bar(): ?mixed {}
throw
式 throw
の変更は次のとおりです。多くの新しい場所で例外をスローできる式: $triggerError = fn () => throw new MyError(); $foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');
弱いマッピング
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);
在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 サイトの他の関連記事を参照してください。