PHP 7.4.0リリース!新しい特性を見てみましょう

12821 ワード

PHP 7.4.0がリリースされ、このバージョンはPHP 7シリーズの4回目の特性更新を示しています.
英語のマニュアルを見ると、多くの改良が行われ、いくつかの新しい特性がもたらされています.
 
1.Typeプロパティ
クラス属性はタイプ宣言をサポートし、次の例では$User->idにint値のみが割り当てられ、$User->nameにstring値のみが割り当てられます.
php

class User {

    public int $id;

    public string $name;

}

?>

・PHP 7.4から利用可能である.
・クラスでのみ使用可能であり、public、protected、private、varなどの修飾子にアクセスする必要があります.
●voidとcallableを除いて、すべてのタイプが許可されています.
PHPは私たちが好きで嫌いな動的言語で、強制タイプを変換しすぎて、時には反作用を引き起こすこともあります.所望の整数で文字列を渡すと、PHPは文字列を自動的に変換しようとします.
class Bar

{

    public int $i;

}

$bar = new Bar;

$bar->i = '1'; // 1

この動作が気に入らない場合は、厳密なタイプを宣言することで無効にできます.
declare(strict_types=1);
$bar = new Bar;

$bar->i = '1'; // 1

Fatal error: Uncaught TypeError: 

Typed property Bar::$i must be int, string used

 
2.Arrow Functions矢印関数
矢印関数は、暗黙的な値によるドメインバインドを持つ関数を定義するための簡略構文を提供します.
php

$factor = 10;

$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);

// $nums = array(10, 20, 30, 40);

?>

●PHP 7.4より利用可能
●fnキーワードで始まる
●return文という表現は1つしかありません
●returnキーは許可されていません
●パラメータおよび戻りタイプは、タイププロンプトであってもよい
間違っていません:短い閉パケットには1つの式しかありません.これは、複数のローを含めることはできません.
理由は次のとおりです.
短い閉鎖の目標は冗長性を減らすことです.fnはもちろんすべての場合functionより短い.しかし、複数行の関数を処理している場合は、短い閉パケットを使用すると得られるメリットは少なくなります.
結局、定義によると、複数行の閉パケットはさらに冗長になっている.したがって、2つのキーワード(functionとreturn)をスキップできるのは大きな違いはありません.
 
3.Limited Return Type Covariance and Argument Type Contravariance有限戻りタイプコヒーレンスとパラメータタイプインバータ
完全コヒーレント/インバータサポートは、自動ロードを使用する場合にのみ提供されます.単一のファイルでは、すべてのクラスが参照される前に使用できる必要があるため、非ループタイプ参照のみが使用できます.
php

class A {}

class B extends A {}

class Producer {

    public function method(): A {}

}

class ChildProducer extends Producer {

    public function method(): B {}

}

?>

 
4.Unpacking Inside Arraysパッケージ内部配列
php

$parts = ['apple', 'pear'];

$fruits = ['banana', 'orange', ...$parts, 'watermelon'];

// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

?>

 
5.Numeric Literal Separator数値文字区切り記号
数値テキストは、数値の間に下線を含めることができます.
php

6.674_083e-11; // float

299_792_458;   // decimal

0xCAFE_F00D;   // hexadecimal

0b0101_1111;   // binary

?>

制限
唯一の制限は、数値テキストの下線が2つの数値の間に直接配置されていることです.この規則は、次の使用法が有効な数値文字ではないことを意味します.
_100; 

100_;       

1__1;       

1_.0; 1._0; 

0x_123;     

0b_101;     

1_e2; 1e_2; 

PHP機能は影響を受けない
数値テキストの数値間に下線を付けると値は変わりません.下線は、構文解析フェーズで削除されるため、実行時に影響を受けません.
var_dump(1_000_000); // int(1000000)

 
6.Weak References弱引用
弱いリファレンスは、オブジェクトのリファレンスを保持し、オブジェクトが破棄されることを阻止しません.
弱いリファレンスでは、オブジェクトのリファレンスを保持できますが、オブジェクトが破棄されるのを阻止しません.これらは、キャッシュのような構造を実現するのに非常に役立ちます.
原則として、弱い参照オブジェクトは複雑ではなく、Zendまたは下のレイヤを使用するだけで、直接サポートしないためです.
final class WeakReference {

    public static function create(object $object) : WeakReference;
  
    public function get() : ?object;

}

 
7.Allow Exceptions from __toString()から__を許可toString()放出異常
これで_からtoString()は異常を引き起こし、従来は致命的なエラーを引き起こし、文字列変換に既存のリカバリ可能な致命的なエラーはError異常に変換された.
7.4以前から禁止されていたtoString()が例外を放出した場合TOString()異常は、致命的なエラーを引き起こします.
技術的な観点から、文字列変換中の例外は、リカバリ可能なエラーを例外に変換するエラーハンドラによってトリガーされる可能性があるため、この制限は最終的に無効である.
set_error_handler(function() {

    throw new Exception();

});

try {

    (string) new stdClass;

} catch (Exception $e) {

    echo "(string) threw an exception...
"; }

また、「文字列に変換できない」と「_toString()は文字列値を返さなければならない」という致命的なエラーを、PHP 7で確立されたエラーポリシーと一致する正しいエラー例外に変換します.
 
8.Opcache Preloading Opcacheプリロード
新しいOpcacheプリロードサポート.
PHP 7.4には、プリロードのサポートが追加されており、コードのパフォーマンスを大幅に向上させることができる特性です.
簡単に言えば、これはその働き方です.
●ファイルをプリロードするには、カスタムPHPスクリプトを作成する必要があります
●このスクリプトは、サーバ起動時に一度実行する
●すべてのプリロードされたファイルがメモリ内ですべての要求に使用可能
●サーバを再起動するまで、プリロードされたファイルに対する変更は影響しません
プリロードはopcacheの上に確立されていますが、完全に同じではありません.Opcacheは、PHPソースファイルを取得し、「opcodes」にコンパイルし、コンパイルしたファイルをディスクに保存します.
オペレーティングコードはコードの最下位表示と見なすことができ、実行時に簡単に説明できます.したがって、opcacheは、ソースファイルとPHP解釈器の実行時に実際に必要とされる変換手順をスキップします.大きな勝利!
しかし、私たちはもっと多くの収穫があります.Opcachedファイルは他のファイルを知らない.クラスAがクラスBから拡張された場合、実行時にそれらをリンクする必要があります.さらに、opcacheは、ソースファイルが変更されたかどうかを確認し、これに基づいてキャッシュを無効にします.
したがって、これは、ソースファイルをオペレーティングコードにコンパイルするだけでなく、関連するクラス、フィーチャー、インタフェースをリンクするプリロードが機能する場所です.その後、この「コンパイル済み」の実行可能コードblob(すなわち、PHP解釈器で使用可能なコード)をメモリに保存します.
リクエストがサーバに到着すると、オーバーヘッドを発生させることなく、メモリにロードされたコードライブラリの一部を使用できます.
プリロードを行うには、開発者がサーバにどのファイルをロードするかを通知する必要があります.これは簡単なPHPスクリプトで完成したもので、確かに何の困難もありません.
ルールは簡単です.
●プリロードスクリプトを提供し、opcacheを使用します.preloadコマンドはphpにリンクします.iniファイルにあります.
●プリロードするPHPファイルごとにopcache_に渡すcompile_file()、またはプリロードスクリプトで1回だけ必要です.
Laravelなどのフレームワークを事前にロードしたいとします.スクリプトはvendor/laravelディレクトリ内のすべてのPHPファイルを巡回し、それらを次々と追加する必要があります.
php.ini:
opcache.preload=/path/to/project/preload.php

これは仮想的な実装です.
$files = /*           */;

foreach ($files as $file) {

    opcache_compile_file($file);

}

警告があります!ファイルをプリロードするには、依存項目(インタフェース、フィーチャー、親)もプリロードする必要があります.
クラス依存項目に問題がある場合は、サーバの起動時に次のように通知されます.
Can't preload unlinked class

Illuminate\Database\Query\JoinClause: 

Unknown parent 

Illuminate\Database\Query\Builder

これは致命的な問題ではありません.サーバは正常に動作します.しかし、あなたが望むプリロードファイルはすべて得られません.
幸いなことに、require_を使用してリンクファイルもロードされることを確認する方法もあります.once代替opcache_compile_fileは、登録されたautoloader(composerかもしれない)に残りの仕事を担当させます.
$files = /*           */;

foreach ($files as $file) {

    require_once($file);

}

注意すべき点もあります.たとえば、Laravelをプリロードしようとすると、フレームワーク内のいくつかのクラスは、まだ存在しない他のクラスに依存します.たとえば、ファイルシステムキャッシュクラスlightingfilesystemcacheはLeagueFlysystemCachedStorageAbstractCacheに依存し、ファイルシステムキャッシュを使用したことがない場合は、プロジェクトにインストールできない場合があります.
#は有効ですか?
これはもちろん最も重要な問題です.すべてのファイルが正しくロードされていますか?サーバを再起動してテストし、opcache_get_status()の出力はPHPスクリプトにダンプされます.preloadという名前が表示されますstatisticsのキーです.プリロードされたすべての関数、クラス、スクリプトがリストされます.およびプリロードファイルで消費されるメモリ.
#パフォーマンス
今から最も重要な問題:プリロードは本当にパフォーマンスを向上させることができますか?
答えは肯定的です:私はいくつかの基準テストを行いました.
興味深いことに、プリロード・コード・ライブラリでよく使用されるクラスのみを決定できます.ベンチマークテストによると、人気クラスは約100個しかロードされず、実際にはすべてのクラスをプリロードするよりも優れたパフォーマンス収益を得ることができます.すべてのクラスをプリロードし、パフォーマンスを13%向上させ、ホットクラスをプリロードすると17%向上させます.
もちろん、事前にロードすべきクラスは、プロジェクトによって異なります.賢明な方法は、開始時にできるだけ多くのプリロードを行うことです.
また、いくつかの廃棄物や、コアから拡張子を削除し、英語の原版マニュアルを参照してください.
https://www.php.net/manual/zh/migration74.new-features.php