ホームページ  >  記事  >  バックエンド開発  >  PHP 7.0 アップグレード ノート、php7.0 アップグレード ノート_PHP チュートリアル

PHP 7.0 アップグレード ノート、php7.0 アップグレード ノート_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 09:46:06766ブラウズ

PHP 7.0 アップグレード ノート、php7.0 アップグレード ノート

PHP 7.0.0 beta1 がリリースされました。これは、目を引くパフォーマンスの向上をもたらしただけでなく、言語機能にも多くの変更をもたらしました。以下は公式アップグレード ノートから LCTT によって翻訳されたものですが、まだ正式リリース版ではありませんが、おそらく正式にリリースされた機能と大きな違いはありません。 (この記事は引き続き追跡および更新されます)

1. 下位互換性のない変更

言語の変更

変数処理の変更

  • 間接的な変数、プロパティ、およびメソッド参照は、左から右のセマンティクスで解釈されるようになりました。いくつかの例:

    1. <span class="pln">$$foo<span class="pun">[<span class="str">'bar'<span class="pun">][<span class="str">'baz'<span class="pun">]<span class="pln"> <span class="com">// 解释做 ($$foo)['bar']['baz'] </span></span></span></span></span></span></span></span>
    2. <span class="pln">$foo<span class="pun">-><span class="pln">$bar<span class="pun">[<span class="str">'baz'<span class="pun">]<span class="pln"> <span class="com">// 解释做 ($foo->$bar)['baz']</span></span></span></span></span></span></span></span>
    3. <span class="pln">$foo<span class="pun">-><span class="pln">$bar<span class="pun">[<span class="str">'baz'<span class="pun">]()<span class="pln"> <span class="com">// 解释做 ($foo->$bar)['baz']()</span></span></span></span></span></span></span></span>
    4. <span class="typ">Foo<span class="pun">::<span class="pln">$bar<span class="pun">[<span class="str">'baz'<span class="pun">]()<span class="pln"> <span class="com">// 解释做 (Foo::$bar)['baz']()</span></span></span></span></span></span></span></span>

    以前の動作を復元するには、明示的に中括弧を追加します:

    1. <span class="pln">$<span class="pun">{<span class="pln">$foo<span class="pun">[<span class="str">'bar'<span class="pun">][<span class="str">'baz'<span class="pun">]}</span></span></span></span></span></span></span></span>
    2. <span class="pln">$foo<span class="pun">->{<span class="pln">$bar<span class="pun">[<span class="str">'baz'<span class="pun">]}</span></span></span></span></span></span>
    3. <span class="pln">$foo<span class="pun">->{<span class="pln">$bar<span class="pun">[<span class="str">'baz'<span class="pun">]}()</span></span></span></span></span></span>
    4. <span class="typ">Foo<span class="pun">::{<span class="pln">$bar<span class="pun">[<span class="str">'baz'<span class="pun">]}()</span></span></span></span></span></span>
  • グローバル キーワードは単純な変数のみを受け入れるようになりました。前みたいに

    1. <span class="kwd">global<span class="pln"> $$foo<span class="pun">-><span class="pln">bar<span class="pun">;</span></span></span></span></span>

    現在、次の記述方法が必要です:

    1. <span class="kwd">global<span class="pln"> $<span class="pun">{<span class="pln">$foo<span class="pun">-><span class="pln">bar<span class="pun">};</span></span></span></span></span></span></span>
  • 変数または関数呼び出しを括弧で囲んでも効果がなくなりました。たとえば、次のコードでは、関数呼び出しの結果が参照によって関数に渡されます

    1. <span class="kwd">function<span class="pln"> getArray<span class="pun">()<span class="pln"> <span class="pun">{<span class="pln"> <span class="kwd">return<span class="pln"> <span class="pun">[<span class="lit">1<span class="pun">,<span class="pln"> <span class="lit">2<span class="pun">,<span class="pln"> <span class="lit">3<span class="pun">];<span class="pln"> <span class="pun">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
    2. <span class="pln">$last <span class="pun">=<span class="pln"> array_pop<span class="pun">(<span class="pln">getArray<span class="pun">());</span></span></span></span></span></span>
    3. <span class="com">// Strict Standards: 只有变量可以用引用方式传递</span>
    4. <span class="pln">$last <span class="pun">=<span class="pln"> array_pop<span class="pun">((<span class="pln">getArray<span class="pun">()));</span></span></span></span></span></span>
    5. <span class="com">// Strict Standards: 只有变量可以用引用方式传递</span>

    括弧が使用されているかどうかに関係なく、厳密な標準エラーをスローするようになりました。以前は、2 番目の呼び出しメソッドにはプロンプトが表示されませんでした。

  • 配列要素またはオブジェクトのプロパティは作成時に参照順序で自動的にインストールされますが、結果の順序は異なります。例:

    1. <span class="pln">$array <span class="pun">=<span class="pln"> <span class="pun">[];</span></span></span></span>
    2. <span class="pln">$array<span class="pun">[<span class="str">"a"<span class="pun">]<span class="pln"> <span class="pun">=&<span class="pln"> $array<span class="pun">[<span class="str">"b"<span class="pun">];</span></span></span></span></span></span></span></span></span></span>
    3. <span class="pln">$array<span class="pun">[<span class="str">"b"<span class="pun">]<span class="pln"> <span class="pun">=<span class="pln"> <span class="lit">1<span class="pun">;</span></span></span></span></span></span></span></span></span>
    4. <span class="pln">var_dump<span class="pun">(<span class="pln">$array<span class="pun">);</span></span></span></span>

    今の結果は ["a" => 1, "b" => 1] ですが、前の結果は ["b" => 1, "a" => 1] でした。

関連する RFC:

  • https://wiki.php.net/rfc/uniform_variable_syntax
  • https://wiki.php.net/rfc/abstract_syntax_tree

list()の変更

  • list() は、値を逆の順序で割り当てなくなりました。例:

    1. <span class="pln">list<span class="pun">(<span class="pln">$array<span class="pun">[],<span class="pln"> $array<span class="pun">[],<span class="pln"> $array<span class="pun">[])<span class="pln"> <span class="pun">=<span class="pln"> <span class="pun">[<span class="lit">1<span class="pun">,<span class="pln"> <span class="lit">2<span class="pun">,<span class="pln"> <span class="lit">3<span class="pun">];</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
    2. <span class="pln">var_dump<span class="pun">(<span class="pln">$array<span class="pun">);</span></span></span></span>

    結果は [3, 2, 1] ではなく $array == [1, 2, 3] になります。代入 の順序が変わっただけで、代入は同じであることに注意してください (LCTT 翻訳注釈: 以前の list() の動作は、次の変数から開始して 1 つずつ値を代入していました。そのため、上記の使用法はこの結果のように [3,2,1] が生成されます)。たとえば、次のような一般的な使用法です

    1. <span class="pln">list<span class="pun">(<span class="pln">$a<span class="pun">,<span class="pln"> $b<span class="pun">,<span class="pln"> $c<span class="pun">)<span class="pln"> <span class="pun">=<span class="pln"> <span class="pun">[<span class="lit">1<span class="pun">,<span class="pln"> <span class="lit">2<span class="pun">,<span class="pln"> <span class="lit">3<span class="pun">];</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
    2. <span class="com">// $a = 1; $b = 2; $c = 3;</span>
    現在の動作を維持します。

  • 空の list() への代入は許可されなくなりました。以下はすべて無効です:

    1. <span class="pln">list<span class="pun">()<span class="pln"> <span class="pun">=<span class="pln"> $a<span class="pun">;</span></span></span></span></span></span>
    2. <span class="pln">list<span class="pun">(,,)<span class="pln"> <span class="pun">=<span class="pln"> $a<span class="pun">;</span></span></span></span></span></span>
    3. <span class="pln">list<span class="pun">(<span class="pln">$x<span class="pun">,<span class="pln"> list<span class="pun">(),<span class="pln"> $y<span class="pun">)<span class="pln"> <span class="pun">=<span class="pln"> $a<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span>
  • list() は文字列の分割をサポートしなくなりました (以前は特定の状況でのみサポートされていました)。次のコード:

    1. <span class="pln">$string <span class="pun">=<span class="pln"> <span class="str">"xy"<span class="pun">;</span></span></span></span></span>
    2. <span class="pln">list<span class="pun">(<span class="pln">$x<span class="pun">,<span class="pln"> $y<span class="pun">)<span class="pln"> <span class="pun">=<span class="pln"> $string<span class="pun">;</span></span></span></span></span></span></span></span></span></span>

    現在の結果は $x == null および $y == null (プロンプトなし) ですが、以前の結果は $x == "x" および $y == "y" でした。さらに、list() は常に ArrayAccess を実装するオブジェクトを処理できるようになりました。例:

    1. <span class="pln">list<span class="pun">(<span class="pln">$a<span class="pun">,<span class="pln"> $b<span class="pun">)<span class="pln"> <span class="pun">=<span class="pln"> <span class="pun">(<span class="kwd">object<span class="pun">)<span class="pln"> <span class="kwd">new<span class="pln"> <span class="typ">ArrayObject<span class="pun">([<span class="lit">0<span class="pun">,<span class="pln"> <span class="lit">1<span class="pun">]);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

    結果は次のようになります: $a == 0 および $b == 1。 以前は、$a と $b は両方とも null でした。

関連RFC:

  • https://wiki.php.net/rfc/abstract_syntax_tree#changes_to_list
  • https://wiki.php.net/rfc/fix_list_behavior_inconsistency

foreachのバリエーション

  • foreach() の反復は配列の内部ポインターに影響を与えなくなり、current()/next() およびその他の一連の関数を通じて配列ポインターにアクセスできるようになります。例:

    1. <span class="pln">$array <span class="pun">=<span class="pln"> <span class="pun">[<span class="lit">0<span class="pun">,<span class="pln"> <span class="lit">1<span class="pun">,<span class="pln"> <span class="lit">2<span class="pun">];</span></span></span></span></span></span></span></span></span></span></span></span>
    2. <span class="kwd">foreach<span class="pln"> <span class="pun">(<span class="pln">$array <span class="kwd">as<span class="pln"> <span class="pun">&<span class="pln">$val<span class="pun">)<span class="pln"> <span class="pun">{</span></span></span></span></span></span></span></span></span></span></span>
    3. <span class="pln"> var_dump<span class="pun">(<span class="pln">current<span class="pun">(<span class="pln">$array<span class="pun">));</span></span></span></span></span></span>
    4. <span class="pun">}</span>

    は値 int(0) を 3 回ポイントします。以前の出力は int(1)、int(2)、および bool(false) でした。

  • 配列を値で反復する場合、foreach は常に配列のコピーを操作し、反復中の配列に対する操作は反復動作に影響しません。例:

    1. <span class="pln">$array <span class="pun">=<span class="pln"> <span class="pun">[<span class="lit">0<span class="pun">,<span class="pln"> <span class="lit">1<span class="pun">,<span class="pln"> <span class="lit">2<span class="pun">];</span></span></span></span></span></span></span></span></span></span></span></span>
    2. <span class="pln">$ref <span class="pun">=&<span class="pln"> $array<span class="pun">;<span class="pln"> <span class="com">// Necessary to trigger the old behavior</span></span></span></span></span></span>
    3. <span class="kwd">foreach<span class="pln"> <span class="pun">(<span class="pln">$array <span class="kwd">as<span class="pln"> $val<span class="pun">)<span class="pln"> <span class="pun">{</span></span></span></span></span></span></span></span></span>
    4. <span class="pln"> var_dump<span class="pun">(<span class="pln">$val<span class="pun">);</span></span></span></span>
    5. <span class="pln"> unset<span class="pun">(<span class="pln">$array<span class="pun">[<span class="lit">1<span class="pun">]);</span></span></span></span></span></span>
    6. <span class="pun">}</span>

    以前は 2 番目の要素 1 がスキップされていましたが (0 1 2)、3 つの要素 (0 1 2) がすべて出力されるようになりました。

  • 配列を参照によって反復する場合、配列への変更は引き続き反復に影響します。ただし、PHP では、数値をキーとして使用する場合に、配列内での位置をより適切に維持できるようになりました。たとえば、参照による反復中に配列要素を追加します。

    1. <span class="pln">$array <span class="pun">=<span class="pln"> <span class="pun">[<span class="lit">0<span class="pun">];</span></span></span></span></span></span>
    2. <span class="kwd">foreach<span class="pln"> <span class="pun">(<span class="pln">$array <span class="kwd">as<span class="pln"> <span class="pun">&<span class="pln">$val<span class="pun">)<span class="pln"> <span class="pun">{</span></span></span></span></span></span></span></span></span></span></span>
    3. <span class="pln"> var_dump<span class="pun">(<span class="pln">$val<span class="pun">);</span></span></span></span>
    4. <span class="pln"> $array<span class="pun">[<span class="lit">1<span class="pun">]<span class="pln"> <span class="pun">=<span class="pln"> <span class="lit">1<span class="pun">;</span></span></span></span></span></span></span></span></span>
    5. <span class="pun">}</span>

    反復により要素が正しく追加されるようになりました。上記のコードの出力は「int(0) int(1)」ですが、以前は単に「int(0)」でした。

  • 通常の (走査不可能な) オブジェクトに対する値による反復または参照による反復は、配列に対する参照による反復と同様に動作します。これは、前の点で述べたより正確な位置管理の改善を除いて、以前の動作と一致しています。

  • 走査可能なオブジェクトに対する反復動作は変更されません。

関連RFC: https://wiki.php.net/rfc/php7_foreach

パラメータ処理の変更

  • 同じ名前の 2 つの関数パラメーターを定義することはできません。たとえば、次のメソッドはコンパイル時エラーを引き起こします:

    1. <span class="kwd">public<span class="pln"> <span class="kwd">function<span class="pln"> foo<span class="pun">(<span class="pln">$a<span class="pun">,<span class="pln"> $b<span class="pun">,<span class="pln"> $unused<span class="pun">,<span class="pln"> $unused<span class="pun">)<span class="pln"> <span class="pun">{</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
    2. <span class="pln"> <span class="com">// ...</span></span>
    3. <span class="pun">}</span>

    上記のコードは、次のような別のパラメーター名を使用するように変更する必要があります。

    1. <span class="kwd">public<span class="pln"> <span class="kwd">function<span class="pln"> foo<span class="pun">(<span class="pln">$a<span class="pun">,<span class="pln"> $b<span class="pun">,<span class="pln"> $unused1<span class="pun">,<span class="pln"> $unused2<span class="pun">)<span class="pln"> <span class="pun">{</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
    2. <span class="pln"> <span class="com">// ...</span></span>
    3. <span class="pun">}</span>
  • func_get_arg() 関数と func_get_args() 関数は、引数に渡された元の値を返さなくなり、代わりに現在の値 (おそらく変更された) を返します。例:

    1. <span class="kwd">function<span class="pln"> foo<span class="pun">(<span class="pln">$x<span class="pun">)<span class="pln"> <span class="pun">{</span></span></span></span></span></span></span>
    2. <span class="pln"> $x<span class="pun">++;</span></span>
    3. <span class="pln"> var_dump<span class="pun">(<span class="pln">func_get_arg<span class="pun">(<span class="lit">0<span class="pun">));</span></span></span></span></span></span>
    4. <span class="pun">}</span>
    5. <span class="pln">foo<span class="pun">(<span class="lit">1<span class="pun">);</span></span></span></span>

    「1」の代わりに「2」が出力されます。コードは func_get_arg(s) を呼び出した後にのみ変更するように変更する必要があります。

    1. <span class="kwd">function<span class="pln"> foo<span class="pun">(<span class="pln">$x<span class="pun">)<span class="pln"> <span class="pun">{</span></span></span></span></span></span></span>
    2. <span class="pln"> var_dump<span class="pun">(<span class="pln">func_get_arg<span class="pun">(<span class="lit">0<span class="pun">));</span></span></span></span></span></span>
    3. <span class="pln"> $x<span class="pun">++;</span></span>
    4. <span class="pun">}</span>

    またはパラメータの変更は避けるべきです:

    1. <span class="kwd">function<span class="pln"> foo<span class="pun">(<span class="pln">$x<span class="pun">)<span class="pln"> <span class="pun">{</span></span></span></span></span></span></span>
    2. <span class="pln"> $newX <span class="pun">=<span class="pln"> $x <span class="pun">+<span class="pln"> <span class="lit">1<span class="pun">;</span></span></span></span></span></span></span>
    3. <span class="pln"> var_dump<span class="pun">(<span class="pln">func_get_arg<span class="pun">(<span class="lit">0<span class="pun">));</span></span></span></span></span></span>
    4. <span class="pun">}</span>
  • 同様に、例外トレースバックには、関数に渡された元の値ではなく、変更された値が表示されます。例:

    1. <span class="kwd">function<span class="pln"> foo<span class="pun">(<span class="pln">$x<span class="pun">)<span class="pln"> <span class="pun">{</span></span></span></span></span></span></span>
    2. <span class="pln"> $x <span class="pun">=<span class="pln"> <span class="lit">42<span class="pun">;</span></span></span></span></span>
    3. <span class="pln"> <span class="kwd">throw<span class="pln"> <span class="kwd">new<span class="pln"> <span class="typ">Exception<span class="pun">;</span></span></span></span></span></span></span>
    4. <span class="pun">}</span>
    5. <span class="pln">foo<span class="pun">(<span class="str">"string"<span class="pun">);</span></span></span></span>

    スタック トレースの結果は次のようになります:

    1. <span class="typ">Stack<span class="pln"> trace<span class="pun">:</span></span></span>
    2. <span class="com">#0 file.php(4): foo(42)</span>
    3. <span class="com">#1 {main}</span>

    以前は:

    1. <span class="typ">Stack<span class="pln"> trace<span class="pun">:</span></span></span>
    2. <span class="com">#0 file.php(4): foo('string')</span>
    3. <span class="com">#1 {main}</span>

    これはコードの実行時の動作には影響しませんが、デバッグ時には異なることに注意してください。

    同じ制限は、debug_backtrace() および関数パラメーターをチェックするその他の関数にも影響します。

関連RFC: https://wiki.php.net/phpng

整数の処理の変更

  • 無効な 8 進表現 (7 より大きい数値を含む) ではコンパイル エラーが発生するようになりました。たとえば、次のコードは機能しなくなります:

    1. <span class="pln">$i <span class="pun">=<span class="pln"> <span class="lit">0781<span class="pun">;<span class="pln"> <span class="com">// 8 不是一个有效的八进制数字!</span></span></span></span></span></span></span>

    以前は、無効な番号 (および無効な番号の後の番号) は単純に無視されていました。以前は、最後の 2 桁が黙って破棄されていたため、上記の $i の値は 7 でした。

  • 負の数を含むバイナリミラーリングディスプレイスメントは算術エラーをスローするようになりました:

    1. <span class="pln">var_dump<span class="pun">(<span class="lit">1<span class="pln"> <span class="pun">>><span class="pln"> <span class="pun">-<span class="lit">1<span class="pun">);</span></span></span></span></span></span></span></span></span>
    2. <span class="com">// ArithmeticError: 以负数进行位移</span>
  • 左にシフトされたビット数が整数の幅を超える場合、結果は常に 0 になります。

    1. <span class="pln">var_dump<span class="pun">(<span class="lit">1<span class="pln"> <span class="pun"><<<span class="pln"> <span class="lit">64<span class="pun">);<span class="pln"> <span class="com">// int(0)</span></span></span></span></span></span></span></span></span></span>

    上記のコードの結果は、使用されている CPU アーキテクチャによって異なります。たとえば、x86 (x86-64 を含む) では、シフト オペランドが範囲内にあるため、結果は int(1) になります。

  • 同様に、整数の幅より多くの桁を右にシフトすると、常に 0 または -1 になります (符号に応じて)。

    1. <span class="pln">var_dump<span class="pun">(<span class="lit">1<span class="pln"> <span class="pun">>><span class="pln"> <span class="lit">64<span class="pun">);<span class="pln"> <span class="com">// int(0)</span></span></span></span></span></span></span></span></span></span>
    2. <span class="pln">var_dump<span class="pun">(-<span class="lit">1<span class="pln"> <span class="pun">>><span class="pln"> <span class="lit">64<span class="pun">);<span class="pln"> <span class="com">// int(-1)</span></span></span></span></span></span></span></span></span></span>

関連RFC: https://wiki.php.net/rfc/integer_semantics

文字列処理の変更

  • 16 進数を含む文字列は数値として扱われなくなり、特別に扱われなくなります。例の新しい動作を確認してください:

    1. <span class="pln">var_dump<span class="pun">(<span class="str">"0x123"<span class="pln"> <span class="pun">==<span class="pln"> <span class="str">"291"<span class="pun">);<span class="pln"> <span class="com">// bool(false) (以前是 true)</span></span></span></span></span></span></span></span></span></span>
    2. <span class="pln">var_dump<span class="pun">(<span class="pln">is_numeric<span class="pun">(<span class="str">"0x123"<span class="pun">));<span class="pln"> <span class="com">// bool(false) (以前是 true)</span></span></span></span></span></span></span></span>
    3. <span class="pln">var_dump<span class="pun">(<span class="str">"0xe"<span class="pln"> <span class="pun">+<span class="pln"> <span class="str">"0x1"<span class="pun">);<span class="pln"> <span class="com">// int(0) (以前是 16)</span></span></span></span></span></span></span></span></span></span>
    4. <span class="pln">var_dump<span class="pun">(<span class="pln">substr<span class="pun">(<span class="str">"foo"<span class="pun">,<span class="pln"> <span class="str">"0x1"<span class="pun">));<span class="pln"> <span class="com">// string(3) "foo" (以前是 "oo")</span></span></span></span></span></span></span></span></span></span></span>
    5. <span class="com">// 注意:遇到了一个非正常格式的数字</span>

    filter_var() を使用して、文字列に 16 進数が含まれているかどうか、または文字列を整数に変換できるかどうかを確認できます。

    1. <span class="pln">$str <span class="pun">=<span class="pln"> <span class="str">"0xffff"<span class="pun">;</span></span></span></span></span>
    2. <span class="pln">$int <span class="pun">=<span class="pln"> filter_var<span class="pun">(<span class="pln">$str<span class="pun">,<span class="pln"> FILTER_VALIDATE_INT<span class="pun">,<span class="pln"> FILTER_FLAG_ALLOW_HEX<span class="pun">);</span></span></span></span></span></span></span></span></span></span>
    3. <span class="kwd">if<span class="pln"> <span class="pun">(<span class="kwd">false<span class="pln"> <span class="pun">===<span class="pln"> $int<span class="pun">)<span class="pln"> <span class="pun">{</span></span></span></span></span></span></span></span></span></span>
    4. <span class="pln"> <span class="kwd">throw<span class="pln"> <span class="kwd">new<span class="pln"> <span class="typ">Exception<span class="pun">(<span class="str">"Invalid integer!"<span class="pun">);</span></span></span></span></span></span></span></span></span>
    5. <span class="pun">}</span>
    6. <span class="pln">var_dump<span class="pun">(<span class="pln">$int<span class="pun">);<span class="pln"> <span class="com">// int(65535)</span></span></span></span></span></span>
  • 二重引用符で囲まれた文字列と HERE ドキュメントに Unicode コードポイント エスケープ構文が追加されたため、無効なシーケンスを持つ "u{" はエラーを引き起こすようになります:

    1. <span class="pln">$str <span class="pun">=<span class="pln"> <span class="str">"u{xyz}"<span class="pun">;<span class="pln"> <span class="com">// 致命错误:无效的 UTF-8 码点转义序列</span></span></span></span></span></span></span>

    これを回避するには、先頭のバックスラッシュをエスケープします:

    1. <span class="pln">$str <span class="pun">=<span class="pln"> <span class="str">"\u{xyz}"<span class="pun">;<span class="pln"> <span class="com">// 正确</span></span></span></span></span></span></span>

    ただし、「u」の後に { が続かない場合は影響を受けません。次のコードはエラーを生成せず、前のコードと同じように機能します:

    1. <span class="pln">$str <span class="pun">=<span class="pln"> <span class="str">"u202e"<span class="pun">;<span class="pln"> <span class="com">// 正确</span></span></span></span></span></span></span>

関連RFC:

  • https://wiki.php.net/rfc/remove_hex_support_in_numeric_strings
  • https://wiki.php.net/rfc/unicode_escape

エラー処理の変更

  • 現在、Exception と Error という 2 つの例外クラスがあります。どちらのクラスも新しいインターフェイス Throwable を実装します。この状況を処理するには、例外処理コードの型ディレクティブを変更する必要がある場合があります。

  • 一部の致命的なエラーと回復可能な致命的なエラーは、代わりにエラーをスローするようになりました。 Error は Exception とは別のクラスであるため、これらの例外は既存の try/catch ブロックではキャッチされません。

    回復可能な致命的なエラーは例外に変換されるため、エラー処理で黙って無視することはできません。場合によっては、タイプ指示の失敗を無視できなくなります。

  • 解析エラーは Error 拡張 ParseError を生成するようになりました。以前の戻り値/errorgetlast() ベースの処理に加えて、無効な可能性のあるコードに対する eval() のエラー処理では、代わりに ParseError をキャッチする必要があります。

  • 内部クラスのコンストラクターは、失敗すると常に例外をスローします。以前は、一部のコンストラクターは NULL または使用できないオブジェクトを返していました。

  • 一部の E_STRICT プロンプトのエラー レベルが変更されました。

関連RFC:

  • https://wiki.php.net/rfc/engine_Exceptions_for_php7
  • https://wiki.php.net/rfc/throwable-interface
  • https://wiki.php.net/rfc/internal_constructor_behaviour
  • https://wiki.php.net/rfc/reclassify_e_strict

その他の言語の変更

  • 互換性のない $this コンテキストを使用した非静的呼び出しの静的呼び出しはサポートされなくなりました。この場合、$this は未定義ですが、非推奨のヒントを使用してその呼び出しが許可されます。例:

    1. <span class="kwd">class<span class="pln"> A <span class="pun">{</span></span></span>
    2. public function test() { var_dump($this); <span class="pun">}</span>
    3. <span class="pun">}</span>
    4. <span class="com">// 注意:没有从类 A 进行扩展</span>
    5. <span class="kwd">class<span class="pln"> B <span class="pun">{</span></span></span>
    6. public function callNonStaticMethodOfA() { A::test(); <span class="pun">}</span>
    7. <span class="pun">}</span>
    8. <span class="pun">(<span class="kwd">new<span class="pln"> B<span class="pun">)-><span class="pln">callNonStaticMethodOfA<span class="pun">();</span></span></span></span></span></span>
    9. <span class="com">// 废弃:非静态方法 A::test() 不应该被静态调用</span>
    10. <span class="com">// 提示:未定义的变量 $this</span>
    11. <span class="pln">NULL</span>

    これは、互換性のないコンテキストからの呼び出しの場合にのみ表示されることに注意してください。クラス B がクラス A から拡張された場合、呼び出しはプロンプトなしで許可されます。

  • 次のクラス名、インターフェース名、特殊名 (大文字と小文字を区別) は使用できません:

    1. <span class="kwd">bool</span>
    2. <span class="kwd">int</span>
    3. <span class="kwd">float</span>
    4. <span class="kwd">string</span>
    5. <span class="kwd">null</span>
    6. <span class="kwd">false</span>
    7. <span class="kwd">true</span>

    これは、クラス/インターフェイス/トレイト宣言、class_alias()、および use ステートメントで使用されます。

    さらに、次のクラス名、インターフェース名、特殊名は将来の使用のために予約されていますが、使用時にエラーはスローされません:

    1. <span class="pln">resource</span>
    2. <span class="kwd">object</span>
    3. <span class="pln">mixed</span>
    4. <span class="pln">numeric</span>
  • yield ステートメント構造は、式のコンテキストで使用するときに括弧を必要としなくなりました。これは、「print」と「=>」の間で優先される右結合演算子になりました。これにより、場合によっては、次のような異なる動作が発生する可能性があります。

    1. <span class="pln">echo <span class="kwd">yield<span class="pln"> <span class="pun">-<span class="lit">1<span class="pun">;</span></span></span></span></span></span>
    2. <span class="com">// 以前被解释如下</span>
    3. <span class="pln">echo <span class="pun">(<span class="kwd">yield<span class="pun">)<span class="pln"> <span class="pun">-<span class="pln"> <span class="lit">1<span class="pun">;</span></span></span></span></span></span></span></span></span>
    4. <span class="com">// 现在被解释如下</span>
    5. <span class="pln">echo <span class="kwd">yield<span class="pln"> <span class="pun">(-<span class="lit">1<span class="pun">);</span></span></span></span></span></span>
    6. <span class="kwd">yield<span class="pln"> $foo <span class="kwd">or<span class="pln"> <span class="kwd">die<span class="pun">;</span></span></span></span></span></span>
    7. <span class="com">// 以前被解释如下</span>
    8. <span class="kwd">yield<span class="pln"> <span class="pun">(<span class="pln">$foo <span class="kwd">or<span class="pln"> <span class="kwd">die<span class="pun">);</span></span></span></span></span></span></span></span>
    9. <span class="com">// 现在被解释如下</span>
    10. <span class="pun">(<span class="kwd">yield<span class="pln"> $foo<span class="pun">)<span class="pln"> <span class="kwd">or<span class="pln"> <span class="kwd">die<span class="pun">;</span></span></span></span></span></span></span></span></span>

    この状況は括弧を追加することで解決できます。

  • ASP (<%) タグとスクリプト (