PHP 7.1:新機能の概要

画像 数か月前にHabréのレビュー付きの翻訳がすでにありましたが、最初のリリース候補PHP 7.1が最近リリースされました。これは、重要な変更はもうないことを意味し、リリースの変更内容を正確に言うことができます。 ブランチの新しいマイナーバージョン7.xがもたらす変更を無料で翻訳することで、乾いた「変更ログ」を少し復活させることにしました。

新機能


void戻り型( RFC )を追加しました


現在、何も返してはならない関数とメソッドは、戻り値型voidでマークできます

function someNethod(): void { //   return  //   return; //    return null; //    return 123; } 

voidとしてマークされたメソッド/関数から値を返すと、 致命的なエラーレベルの例外がスローされますNULL値はvoid (値なし)と等しくないことに注意してください。つまり、 NULLを返すことはできません。

ところで、これは$ x = someNethod();という意味ではありません 何も返しません。 前と同じように、 $ xNULL値になります。 また、voidをパラメーターの型として使用することはできません。

 function bar(void $foo) {} // : Fatal error: void cannot be used as a parameter type in.... 

新しい疑似タイプが追加されました: “ iterable”RFC


 function walkList(iterable $list): iterable { foreach ($list as $value) { yield $value['id']; } } 

この型は基本的に、プリミティブ型の配列Traversableインターフェイス(およびその派生物: IteratorGeneratorなど)を組み合わせます。 たとえば、 foreachは両方のタイプで機能するが、タイプ配列を持つ関数はTraversableインターフェイスを持つオブジェクトを受け入れず、その逆も同様であるため、問題が発生しました。

また、このRFCのフレームワーク内で、新しい関数is_iterable()が追加されました。これは、他のis_ *関数と同様に機能します。

型付きで返されたパラメーターでnullを許可できるようになりました( Nullable RFC


 function callMethod(?Bar $bar): ?Bar {} $this->callMethod($bar); //  $this->callMethod(null); //  $this->callMethod(); //   

「?」の使用に注意してください デフォルトのヌル値は次と同じではありません

 function callMethod(int $bar = null) {} $this->callMethod(1); //  $this->callMethod(null); //  $this->callMethod(); //   

「?」を追加します 動作に後方互換性を残します

 function callMethod(?Bar $bar = null) {} //       “?” 

継承に関する重要なポイント:

 interface Fooable { function foo(int $i): ?Fooable; } interface StrictFooable extends Fooable { function foo(?int $i): Fooable; // valid } 

後継では、戻り値の型を「より厳密に」(つまり、 nullableを禁止)し、逆にパラメーターをnullableに拡張できますが、その逆はできません!

行オフセット( RFC )に負の値を使用する機能を追加しました


 echo $msg[-1]; //    echo $msg{-3}; //  RFC     $str{}   $str[]            . 

負の値は、文字列関数strpos、stripos、substr_count、grapheme_strpos、grapheme_stripos、grapheme_extract、iconv_strpos、file_get_contents、mb_strimwidth、mb_ereg_search_setpos、mb_strpos、mbでも使用できます。

どこでも、行末からのオフセットをカウントすることを意味します。

リスト()RFC )コンストラクトで文字列キーを使用できます


リストの短い構文( RFC )も追加されました。

 ["test" => $a, "name" => $b] = ["name" => "Hello", "test" => "World!"]; var_dump($a); // World! var_dump($b); // Hello 

機能:


呼び出し可能な式をクロージャー( RFC )に変換します


 Closure::fromCallable(callable $calback); 

ここにアプリケーションの良い例があります:

 class A { public function getValidator(string $name = 'byDefault') { return Closure::fromCallable([$this, $name]); } private function byDefault(...$options) { echo "Private default with:".print_r($options, true); } public function __call ( string $name , array $args ) { echo "Call $name with:".print_r($args, true); } } $a = new A(); $a->getValidator("test")(1,2,3); // Call test with: Array ( [0] => 1 [1] => 2 [2] => 3 ) $a->getValidator()('p1', 'p2'); // Private default with: Array ( [0] => 'p1', [1] => 'p2') //  Closure::fromCallable   ($this)     ,        //    return [$this, $name];  $a->getValidator()('p1', 'p2'); //  // Call byDefault with:Array ( [0] => p1 [1] => p2 ) //                

クラス定数( RFC )の可視性修飾子のサポート


 class Token { //      “public” const PUBLIC_CONST = 0; //      private const PRIVATE_CONST = 0; protected const PROTECTED_CONST = 0; public const PUBLIC_CONST_TWO = 0; //       private const FOO = 1, BAR = 2; } 

いくつかのタイプの例外を1つのブロックにまとめることで、例外をキャッチできます( RFC


 try { echo "OK"; } catch (Exception | DomainException $e) { // ...  2    } catch (TypeError $e) { // ... } 

無効な数値( RFC )を含む文字列の算術演算中のE_NOTICEおよびE_WARNINGレベルのエラー


 $numberOfApples = "10 apples" + "5 pears"; //  // Notice: A non well formed numeric string encountered in example.php on line 3 // Notice: A non well formed numeric string encountered in example.php on line 3 $numberOfPears = 5 * "orange"; // Warning: A non-numeric string encountered in example.php on line 3 

これは非常に重要な変更であり、エラーハンドラーを使用して警告をインターセプトすると、理論的にはアプリケーションの下位互換性が損なわれる可能性があります。

また、興味深い機能があります。「5」+「3」の行の先頭のスペースはエラーになりません。 しかし、「5」+「3」-最後にスペースがあると警告が表示されます。

暗黙の変換の結果を回避し、警告をスローするには、目的のタイプで「キャスト」を明示的に指定できます:(int)「5」+(int)「3」、またはすべてを強制@(「5」+「3」)で抑制します。

その他の変更と後方非互換性



おそらくここで終了しますが、まだ主に拡張機能に多くのマイナーな変更があります。 そして、ホリバーにとっては、このリストで十分です。 )

まとめ


個人的には、このマイナーリリースに関する私の意見は次のとおりです。すべてが非常に有機的に適合し、これはまさに新しいPHP 7.0の大部分に欠けていたものであり、これらの変更は7.xブランチの機能を強調および強化するだけです。
7.1.1を待つことをお勧めします。恐れることなく更新して、何かを壊すことができます(もちろん7.0に切り替えていない限り)。

この記事は、すべての変更の完全な説明であるとは主張しておらず、重要なものを見逃している可能性があります。
" Https://wiki.php.net/rfc#php_71
» Https://github.com/php/php-src/blob/php-7.1.0RC1/UPGRADING

PS サンプルは、オンラインサンドボックス-3v4l.org/#version=7.1.0RC1で体験できます。

Source: https://habr.com/ru/post/J309858/


All Articles