PHP 7.4 は PHP 7 の次のマイナー バージョンで、2019 年 11 月 28 日に一般公開される予定です。 PHP の高速化と信頼性の向上を実現する PHP 7.4 の新機能を見てみましょう。
もちろん、私は PHP 8 をもっと楽しみにしています。 JIT の提案の一部が承認されたため、これは PHP にとって新たなマイルストーンとなる可能性があります。
PHP 7.4 を使用した PHP の新機能は何ですか?
#● 配列内でのアンパックのサポート - 配列展開演算子##● アロー関数 2.0 (短いクロージャ)
配列内の PHP 7.4 Spread 演算子は式に導入され、PHP 5.6 以降で利用可能です。
Parameter unpacking は、配列と Traversable をパラメータ リストに解凍するための構文です。配列または Traversable を解凍するには、次の例のように、先頭に ... (3 つのドット) を付ける必要があります。 function test(...$args) { var_dump($args); }
test(1, 2, 3);
では、この機能を配列に拡張することが推奨されています。 : $arr = [...$args];
:Spread 演算子の方が array_merge よりも優れたパフォーマンスが必要であると記載されています。スプレッド演算子が構文構造であり、array_merge がメソッドであるというだけではありません。また、コンパイル時に、定数配列は高効率を実現するために最適化されます。Spread 演算子の大きな利点は、array_merge 関数が配列のみをサポートするのに対し、任意の走査可能なオブジェクトをサポートすることです。
以下は、Spread 演算子を使用した配列内のパラメーターの例です:
$parts = ['apple', 'pear']; $fruits = ['banana', 'orange', ...$parts, 'watermelon']; var_dump($fruits);
このコードを PHP 7.3 以前で実行すると、PHP は解析エラーをスローします:
Parse error: syntax error, unexpected '...' (T_ELLIPSIS), expecting ']' in /app/spread-operator.php on line 3
代わりに、PHP 7.4 は配列を返します
array(5) { [0]=> string(6) "banana" [1]=> string(6) "orange" [2]=> string(5) "apple" [3]=> string(4) "pear" [4]=> string(10) "watermelon" }
RFC には、同じ配列を複数回拡張できると記載されています。さらに、スプレッド演算子の前後に通常の要素を追加できるため、配列内のどこでもスプレッド演算子の構文を使用できます。したがって、次のコードは期待どおりに機能します。
$arr1 = [1, 2, 3]; $arr2 = [4, 5, 6]; $arr3 = [...$arr1, ...$arr2]; $arr4 = [...$arr1, ...$arr3, 7, 8, 9];
関数によって返された配列をパラメータとして渡し、それを新しい配列に入れることもできます。
function buildArray(){ return ['red', 'green', 'blue']; } $arr1 = [...buildArray(), 'pink', 'violet', 'yellow'];
PHP 7.4 の出力次の配列:
array(6) { [0]=> string(3) "red" [1]=> string(5) "green" [2]=> string(4) "blue" [3]=> string(4) "pink" [4]=> string(6) "violet" [5]=> string(6) "yellow" }
:
function generator() { for ($i = 3; $i <= 5; $i++) { yield $i; } } $arr1 = [0, 1, 2, ...generator()];
も使用できますが、参照渡しは許可されません。次の例を考えてみましょう:$arr1 = ['red', 'green', 'blue'];
$arr2 = [...&$arr1];
Parse error: syntax error, unexpected '&' in /app/spread-operator.php on line 3
最初の配列の要素が参照によって格納されている場合、それらは2 番目の配列にも参照によって格納されます。以下は例です:
$arr0 = 'red'; $arr1 = [&$arr0, 'green', 'blue']; $arr2 = ['white', ...$arr1, 'black'];
これは PHP 7.4 で得られるものです:
array(5) { [0]=> string(5) "white" [1]=> &string(3) "red" [2]=> string(5) "green" [3]=> string(4) "blue" [4]=> string(5) "black" }
PHP で、匿名関数は非常に冗長で、実装と保守が難しいと考えられています。 RFC コードを簡潔に記述できるように、より単純で明確なアロー関数 (または短いクロージャー) 構文を導入することをお勧めします。
PHP 7.4 より前: function cube($n){
return ($n * $n * $n);
}
$a = [1, 2, 3, 4, 5];
$b = array_map('cube', $a);
print_r($b);
$a = [1, 2, 3, 4, 5]; $b = array_map(fn($n) => $n * $n * $n, $a); print_r($b);
現在、言語構造により、
匿名関数(クロージャ) は、以下に示すように、 use を使用して、親スコープで定義された変数を継承できます。
$factor = 10; $calc = function($num) use($factor){ return $num * $factor; };
ただし、PHP 7.4 では、親スコープの値が暗黙的にキャプチャされます (暗黙的に)。値のスコープによって制限されます)。したがって、この関数は 1 行で完了できます: $factor = 10;
$calc = fn($num) => $num * $factor;
新しい構文により、より読みやすく保守しやすいコードを構築できるため、言語が大幅に改善されました。
NULL 合体演算子日常の使用では三項式と isset() が同時に使用される状況が多数あるため、NULL 合体演算子 (? ?) この糖衣構文。変数が存在し、NULL でない場合はそれ自体の値を返し、それ以外の場合は 2 番目のオペランドを返します。 $username = $_GET['user'] ?? ‘nobody';
$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';
长远来看,这段代码可能难以维护。因此,旨在帮助开发人员编写更直观的代码,这个 RFC 建议引入 null 合并等于运算符 (null_coalesce_equal_operator)??=,所以我们可以敲下面这段代码来替代上面的这段代码:
$this->request->data['comments']['user_id'] ??= ‘value’;
如果左侧参数的值为 null,则使用右侧参数的值。
注意,虽然 coalesce 运算符 ?? 是一个比较运算符,但 ??= 它是赋值运算符。