
新機能
void戻り型( RFC )を追加しました
現在、何も返してはならない関数とメソッドは、戻り値型voidでマークできます 。
function someNethod(): void { // return // return; // return null; // return 123; }
voidとしてマークされたメソッド/関数から値を返すと、 致命的なエラーレベルの例外がスローされます 。 NULL値はvoid (値なし)と等しくないことに注意してください。つまり、 NULLを返すことはできません。
ところで、これは$ x = someNethod();という意味ではありません。 何も返しません。 前と同じように、 $ xはNULL値になります。 また、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インターフェイス(およびその派生物: Iterator 、 Generatorなど)を組み合わせます。 たとえば、 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
機能:
- 混合構文を使用することはできません(キーを指定する場合はすべての場所で指定し、そうでない場合は通常のインデックス0、1、2 ...が通常どおり使用されます)。
// Parse error: syntax error, ... ["a" => $a, $b] = ["a" => 1, 2]
- キーを持つ空の要素も許可されていません。
// Parse error: syntax error, ... list(,,,, "key" => $keyed) = $array;
- ソース配列にキーがない場合、 注意:未定義のインデックス:名前の警告がスローされ、変数はNULLになります
- ネストされたリスト構造を使用する場合、メソッドを組み合わせることができます
$points = [ ["x" => 1, "y" => 2], ["x" => 2, "y" => 1] ]; [["x" => $x1, "y" => $y1], ["x" => $x2, "y" => $y2]] = $points;
呼び出し可能な式をクロージャー( 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」)で抑制します。
その他の変更と後方非互換性
- 新しい型に関連して、新しい予約語void 、 iterableが追加され 、そのような名前のクラス、インターフェース、特性を含むコードは7.1でエラーを発生します
- エラー例外(現在のカーネル7.0など)をスローする代わりに致命的なエラーをスローし続けるphp拡張機能の動作を変更し、さらにE_ERRORまたはE_RECOVERABLE_ERRORレベルのエラーも例外をスローし始めました(十分なメモリがない場合にスクリプトが不可逆的にクラッシュすることは明らかです( RFC ))。
- 必要な引数を渡さずに関数/メソッドを呼び出すときの動作を変更しました。 これで、通常の警告警告の代わりに、 ArgumentCountError例外がスローされます( エラー RFCタイプを継承します )。
function foo($a) { var_dump($a); // $a NULL } foo(); // Fatal error: Uncaught ArgumentCountError: Too few arguments to function foo(), 0 passed in...
- 次の関数は、 $ func()、call_user_func()、array_map()などを介して動的に呼び出すことはできなくなりました。
- 抽出()
- コンパクト()
- get_defined_vars()
- func_get_args()
- func_get_arg()
- func_num_args()
- parse_str()と1つの引数
- mb_parse_str()と1つの引数
- assert()は文字列を引数として使用できなくなりました
- rand()およびsrand()関数は、 mt_rand()およびmt_srand()関数の単なるエイリアスになりました 。
これは、そのような関数の出力に影響を与えます。
- ランド()
- シャッフル()
- str_shuffle()
- array_rand()
- session_gc()関数を追加しました。 これで、スクリプトから古いセッションを直接クリーンアップできます。
- session_create_id()関数を追加しました。これにより、新しいセッションを開始せずに有効な自動セッションIDを生成できます。これは、以前に生成されたIDでセッションを開始するsession_id()で使用できます。
- ハッシュを削除し、7.0から新しい関数を使用することにより、セッションIDの生成を2回以上加速php_random_bytes()
速度:1秒あたりのリクエスト:899.36 [#/秒] 後の速度:1秒あたりのリクエスト:2278.59 [#/秒]
- この変数$の一貫性のない動作を削除しました
function foo($this) { // Fatal error: Cannot use $this as parameter } static $this; // Fatal error: Cannot use $this as static variable global $this; // Fatal error: Cannot use $this as global variable try { ... } catch (Exception $this) { // Fatal error: Cannot re-assign $this } foreach ($a as $this) { // Fatal error: Cannot re-assign $this } unset($this); // Fatal error: Cannot unset $this $a = "this"; $$a = 42; // throw new Error("Cannot re-assign $this") function foo() { var_dump($this); // throws "Using $this when not in object context" // php-7.0 emitted "Undefined variable: this" and printed NULL } foo(); //
- mcrypt拡張は廃止とマークされ、すべてのmcrypt_ *関数はE_DEPRECATEDをスローします。
- HTTP / 2サーバープッシュのサポートがcurl拡張機能に追加され、新しい関数curl_multi_errno()、curl_share_errno()、curl_share_strerror()が追加されました。
- mb_ereg_replace()およびmb_eregi_replace()関数の「e」オプションは非推奨です。
おそらくここで終了しますが、まだ主に拡張機能に多くのマイナーな変更があります。 そして、ホリバーにとっては、このリストで十分です。 )
まとめ
個人的には、このマイナーリリースに関する私の意見は次のとおりです。すべてが非常に有機的に適合し、これはまさに新しい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で体験できます。