PHP 8の新特性紹介


PHP 8の新特性
新しい主要PHPバージョンPHP 8は2020年末にリリースされる予定です。今は非常に活発な開発段階にありますので、これから数ヶ月の間に、大きな変化が起こるかもしれません。
この記事では、期待されるコンテンツリストを更新し続けます。新しい特性、性能の改善と大きな変化。PHP 8は新しいメインバージョンですので、コードが破壊される確率がもっと高いです。最新バージョンを更新している場合、アップグレードは難しくないはずです。ほとんどの変更は7年前に破棄されました。バージョン
中断の変更以外に、PHP 8はJITコンパイラとunionタイプのような良い新特性を持ってきました。もっとあります
ユニオンtypes:ユニオンタイプ
PHPの動的なタイプ化特性を考慮して,多くの場合,結合型が有用である。結合タイプは2つ以上のタイプのセットであり、これらのタイプは1つが使用可能であることを示している。

public function foo(Foo|Bar $input): int|float;
なお、voidは常にunionタイプの一部ではなく、「戻り値が全くない」という意味です。また、空とすることができる結合を作成するには、|nullを使用することもできますが、既存のものを使用することもできますか?記号:

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

public function bar(?Bar $bar): void;
JI
インスタントコンパイラは、常にウェブ要求のコンテキストではなく、顕著な性能改善を約束する。まだ正確な基準はありませんが、必ず来ます。
Static return type:静的戻りタイプ
すでにselfに戻ることができますが、静的タイプはPHP 8まで有効な戻りタイプとなります。この特性はPHPの動的タイプ特性を考慮して多くの開発者に有用である。

class Foo
{
  public function test(): static
  {
    return new static();
  }
}
Weak maps
PHP 7.4に追加したweakrefs RFCをベースに、PHP 8にWeakMapを追加して実現しました。弱写像には対象への参照が含まれています。これらのオブジェクトがゴミ収集されるのを阻止することはできません。
ormを例にとって、それらは通常、エンティティクラスに対する参照を保存するキャッシュを実現し、エンティティ間の関係の性能を向上させる。これらの実体オブジェクトはごみによって回収できません。このキャッシュにはそれらに対する参照があります。キャッシュが唯一それらを参照するものであっても。
このキャッシュ層が弱い参照とマッピングを使用すると、PHPは他のオブジェクトがそれらを参照していないときにこれらのオブジェクトをゴミ収集する。特にormは、数百個のエンティティ(数千個でない場合)を一つの要求において管理することができる。弱マッピングは、これらのオブジェクトを処理するために、より良いリソースに対してより友好的な方法を提供する。
弱写像の様子は、RFCからの例である。

class Foo 
{
  private WeakMap $cache;

  public function getSomethingWithCaching(object $obj): object
  {
    return $this->cache[$obj]
      ??= $this->computeSomethingExpensive($obj);
  }
}
:class on object
小さくて有用な新しい特性:今は対象に使うことができます。:クラスは対象にget_を使う必要がありません。クラス。その働き方とget_クラスは同じです。

$foo = new Foo();

var_dump($foo::class);
Steringgable interface
Stringgableインターフェースは、ヒントの任意の文字列を入力するために使用されてもよく、またはtring()の内容を実現してもよい。また、いつのクラスでもTotring()が実現されます。バックグラウンドで自動的にインターフェースが実現されます。手動で実現する必要はありません。

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

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

bar(new Foo());
bar('abc');
インターフェースからDateTimeオブジェクトを作成します。
DateTimeを使ってもいいです。Createfrom mutable datetimeはdatetimeオブジェクトからDateTimeオブジェクトを作成しますが、他の方法は厄介です。DateTimeを追加することにより:createFrom Interface()とdatetime:createFroom Interface()は、現在、DateTimeとdatetimeオブジェクトを相互に変換する共通の方法があります。

DateTime::createFromInterface(DateTimeInterface $other);

DateTimeImmutable::createFromInterface(DateTimeInterface $other);
エンジンの警告を再定義します。
警告または通知のみをトリガした多くのエラーが正しいエラーに変換されました。以下の警告は変更されました。
  • Udefined variable:Err exception instead of notice
  • Udefined array index:warning instead of notice
  • Division by zero:DivisionByZerEror exception instead of warning
  • Attempt to increment/decrement property'%s'of non-oject:Err exception instead of warning
  • Attempt to modify property'%s'of non-object:Err exception instead of warning
  • Attempt to assign property'%s'of non-object:Err exception instead of warning
  • Creating default object from empy value:Err exception instead of warning
  • Trying to get property'%s'of non-object:warning instead of notice
  • Unidefined property:%s:::warning instead of notice
  • Canot add element to the array as the next element is already occupied:Err exception instead of warning
  • Canot unset offset in a non-ary variable:Err exception instead of warning
  • Canot use a scalar value as an array:Err exception instead of warning
  • Only arrays and Traversables can be unpacked:TypeError exception instead of warning
  • Invalid argment supplied for foreach():Type Error exception instead of warning
  • Illegel offset type:Type Error exception instead of warning
  • Illegel offset type in isset or empty:Type Error exception instead of warning
  • Illegel offset type in unset:Type Error exception instead of warning
  • Aray 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
  • Uniitialized string offset:%d:warning instead of notice
  • Canot assign empty string to a string offset:Err exception instead of warning
  • 以上はPHP 8の新特性紹介の詳細です。php 8の新特性に関する資料は他の関連記事に注目してください。