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で体験できます。



All Articles