ホームページ  >  記事  >  エキサイティングな PHP7.4

エキサイティングな PHP7.4

藏色散人
藏色散人転載
2019-08-28 14:20:0510556ブラウズ

エキサイティングな PHP7.4

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);
ただし

PHP 7.4 RFC

では、この機能を配列に拡張することが推奨されています。 :

  $arr = [...$args];
Spread 演算子の最初の利点はパフォーマンスです。

RPC ドキュメントには、

: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"
  }

generator

:

function generator() {
    for ($i = 3; $i <= 5; $i++) {
        yield $i;
    }
  }
  $arr1 = [0, 1, 2, ...generator()];

も使用できますが、参照渡しは許可されません。次の例を考えてみましょう:

$arr1 = [&#39;red&#39;, &#39;green&#39;, &#39;blue&#39;];
  $arr2 = [...&$arr1];
参照渡ししようとすると、PHP は次の解析エラーをスローします:

Parse error: syntax error, unexpected &#39;&&#39; in /app/spread-operator.php on line 3

最初の配列の要素が参照によって格納されている場合、それらは2 番目の配列にも参照によって格納されます。以下は例です:

   $arr0 = &#39;red&#39;;
  $arr1 = [&$arr0, &#39;green&#39;, &#39;blue&#39;];
  $arr2 = [&#39;white&#39;, ...$arr1, &#39;black&#39;];

これは 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"
  }

Arrow Functions 2.0 (ショート クロージャ)

PHP で、匿名関数は非常に冗長で、実装と保守が難しいと考えられています。 RFC コードを簡潔に記述できるように、より単純で明確なアロー関数 (または短いクロージャー) 構文を導入することをお勧めします。

PHP 7.4 より前:

function cube($n){
    return ($n * $n * $n);
  }
  $a = [1, 2, 3, 4, 5];
  $b = array_map(&#39;cube&#39;, $a);
  print_r($b);
PHP 7.4 ではより簡潔な構文が使用できるため、上記の関数は次のように書き換えることができます:

$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;
親スコープで定義された変数はアロー関数に使用できます。これは use の使用と同等であり、親によって変更することはできません。

新しい構文により、より読みやすく保守しやすいコードを構築できるため、言語が大幅に改善されました。

NULL 合体演算子

日常の使用では三項式と isset() が同時に使用される状況が多数あるため、NULL 合体演算子 (? ?) この糖衣構文。変数が存在し、NULL でない場合はそれ自体の値を返し、それ以外の場合は 2 番目のオペランドを返します。

$username = $_GET[&#39;user&#39;] ?? ‘nobody&#39;;
このコードの動作は非常に単純です。リクエスト パラメータを取得し、存在しない場合はデフォルト値を設定します。しかし、この RFC の例では、変数名が長い場合はどうなるでしょうか?

$this->request->data[&#39;comments&#39;][&#39;user_id&#39;] = $this->request->data[&#39;comments&#39;][&#39;user_id&#39;] ?? &#39;value&#39;;

长远来看,这段代码可能难以维护。因此,旨在帮助开发人员编写更直观的代码,这个 RFC 建议引入 null 合并等于运算符 (null_coalesce_equal_operator)??=,所以我们可以敲下面这段代码来替代上面的这段代码:

$this->request->data[&#39;comments&#39;][&#39;user_id&#39;] ??= ‘value’;

如果左侧参数的值为 null,则使用右侧参数的值。

注意,虽然 coalesce 运算符 ?? 是一个比较运算符,但 ??= 它是赋值运算符。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。