赤ちゃんを期待しているときに何を期待するか:PHP 7、パート1

これは、「PHP7に期待すること」という記事のミニシリーズの最初の部分です。 パート2を読む

ご存知の方も多いでしょうが、RFCはPHPの次のメジャーバージョンであるPHP7と呼ばれる名前ネゴシエーションを採用しています。 あなたは私のPHP5タイムラインでそれについて読むことができます

このトピックについてのあなたの気持ちに関係なく、PHP7は既成事実であり、 今年も登場します! PHP7.0リリースのタイムライン含む RFCはほぼ満場一致で(32対2)通過し、開発者は機能をフリーズする段階に達しました 。6月中旬に最初のリリース候補(RC)が表示されます。

しかし、これは私たち普通の開発者にとって何を意味するのでしょうか? 現在、新しいバージョン5.xの方向への移行にはWebホストの大きな抵抗が見られます。 後方互換性を損なうメジャーアップグレードは、動作をさらに遅くする可能性がありますか?

回答:表示されます。 読み続けて詳細を確認してください。

非標準的な状況での不正な動作に関する問題のほとんどは修正されました。 さらに、パフォーマンスとトラブルシューティングは、このリリースの重要な領域です。

詳細を掘り下げましょう。

コンプライアンス修正


残念ながら、 needle/haystackチケットはまだ解決されていません。 ただし、2つの非常に重要なRFCが合格しました。 したがって、非常に必要なシーケンスと期待される構文の到着の希望を失わないでください。

最大の(そして最も目立たない)のは、抽象構文ツリー(AST)の追加でした。これは、コンパイル時のコードの中間表現です。 ASTを使用すると、コア開発者は境界線のケースをより適切に処理し、動作の不整合を解消し、将来の驚くべきことへの道を開くことができます。たとえば、より生産的なアクセラレーターを作成できます。

単一の変数構文も導入されおり、PHP7への多くの移行問題を引き起こす可能性があります。 式の計算における多数の矛盾を解決します。 たとえば、 ($object->closureProperty)()を介してパラメータにバインドされた匿名関数を呼び出す機能は、静的メソッドのチェーンを呼び出す機能も追加します。

 class foo { static $bar = 'baz'; } class baz { static $bat = 'Hello World'; } baz::$bat = function () { echo "Hello World"; }; $foo = 'foo'; ($foo::$bar::$bat)(); 

ただし、何かが変更されました。 特に、変数変数/プロパティを使用するセマンティクス。

PHP7より前では、 $obj->$properties['name']は、名前が$properties配列のnameキーによって保存された値の一部であるプロパティにアクセスしていました。 これで、配列のnameキーによって値にアクセスできるようになります。配列のnameキーは、オブジェクトの$propertiesパラメーターの値によって決定されます。

または、より簡潔にするために、この声明を受け入れた場合:

 $obj->$properties['name'] 

これはPHP5.6で、次のように解釈されます:

 $obj->{$properties['name']} 

PHP 7では:

 {$obj->$properties}['name'] 

通常、変数変数の使用は境界線の場合であり、コミュニティによって非常に不承認になっていますが、私の実践ではパラメーター変数ははるかにまれです。 ただし、中括弧(上記の例のように)を使用してPHP5.6とPHP7の間で同様の動作を保証する場合、移行の問題なく簡単に実行できます。

性能


PHP7にアップグレードする最大の理由はパフォーマンスであり、その特性は主にphpngにあります。 生産性の向上は、小規模なホスティング事業者がバージョン7に迅速に移行するための決定的な要因になる可能性があります。これは、同じホストをより多くの顧客に提供できるためです。

現時点では、次のとおりです。PHP7は、Facebookによって記述されたHHVMと同等であり、PHPコードをマシン命令に変換するJust In Time(JIT)コンパイラーとして機能します。

PHP7にはJITコンパイラがありませんが、それについては多くの議論がありました。 このステップがどのようなパフォーマンス向上をもたらすかは不明ですが、誰かがまだそれを行うことに決めているかどうかを確認するのは面白いでしょう。

パフォーマンスに加えて、内部データ構造を最適化することの重要な副作用は、メモリの大幅な節約になります。

下位互換性の変更


もちろん、コア開発者は以前のバージョンとの下位互換性を損なわないように非常に懸命に努力しましたが、残念ながら、これは言語を前進させるときに常に可能であるとは限りません

ただし、Uniform Variable Syntaxの導入による動作の変更と同様に、革新のほとんどはマイナーです。たとえば、 非オブジェクトでメソッドを呼び出すときに致命的なエラーをキャッチしました

 set_error_handler(function($code, $message) { var_dump($code, $message); }); $var = null; $var->method(); echo $e->getMessage(); // Fatal Error: Call to a member function method() on null echo "Hello World"; // Still runs 

さらに、APSとscriptタグが削除され、 <%<%= 、または`<script language="php”>`とそれらの終了タグ%>使用できなくなりました。

RFCにはすべての非推奨機能削除するための 、より深刻な変更があります

特に注目すべきは、posix互換の正規表現ext / ereg(5.3での使用は推奨されません)および古いext / mysql拡張(5.5の新しい拡張に置き換えられます)の標準拡張パッケージからの除外です。

その他の小さな変更の1つは、 switchで複数のdefaultを使用することの禁止default 。 バージョン7より前のPHPでは、これを行うことができました。

 switch ($expr) { default: echo "Hello World"; break; default: echo "Goodbye Moon!"; break; } 

これは最後のものだけを実行します。 PHP7はエラーをスローします:

 Fatal error: Switch statements may only contain one default clause 

新機能


もちろん、後方互換性を損なう変更の結果を処理できます。 パフォーマンスを重視しています。 しかし、私たちはさらに新しい機会を楽しんでいます! すべてのリリースが楽しみになるのは新しい機能であり、PHP7も例外ではありません。

スカラー型のヒントと戻り値


PHP7で追加された最も議論の余地のあるポイント、 スカラータイプヒントから始めます。 RFCはこの機能の追加にほぼ賛成しましたが、作者はそれについての議論に非常に影響を受けたため、PHP開発を終了することを決定し、RFCも投票から削除しました。 これに続いて、競合する実装がいくつかありました。 最終的に(肯定的に)終了した多くの騒乱があり、RFCの元のバージョンが採用されました。

エンドユーザーにとって、これは、スカラー値でtype-hintを使用できることを意味します。 つまり、 intfloatstringおよびboolです。 デフォルトでは、関数は非厳密モードで動作します。つまり、元の型を型ヒントで指定された値に単純にキャストします。 たとえば、整数を必要とするint(1)を渡した場合、 float(1.0)キャストされます。 そしてその逆:整数を必要とする関数に渡すと、 float(1.5)int(1)が返されます。 例:

 function sendHttpStatus(int $statusCode, string $message) { header('HTTP/1.0 ' .$statusCode. ' ' .$message); } sendHttpStatus(404, "File Not Found"); // integer and string passed sendHttpStatus("403", "OK"); // string "403" coerced to int(403) 

厳密な型指定モードのdeclare(strict_types=1);有効にできますdeclare(strict_types=1); ファイルの先頭にあり、 このファイルで行われた関数呼び出し特定の型に厳密に従うことを保証します。 これは、 declare呼び出されたファイルで発生し、呼び出された関数が定義されたファイルでは発生しません。

タイプが一致しない場合、キャッチ致命的エラーがスローされます。

 declare(strict_types=1); //      sendHttpStatus(404, "File Not Found"); // integer  string  sendHttpStatus("403", "OK"); // Catchable fatal error: Argument 1 passed to sendHttpStatus() must be of the type integer, string given 

PHP7は引数として同じ型をすべて受け入れることができる戻り型もサポートしいます。 構文は、 hackのように、ブラケットの前に接尾辞引数を付けたコロンになります。

 function isValidStatusCode(int $statusCode): bool { return isset($this->statuses[$statusCode]); } 

この例では: boolは、関数がブール値を返すことを示します。

type-hintに適用されるのと同じ規則は、strictモードを宣言するときにもここで機能します。

結合比較演算子


PHP7で私のお気に入りの追加は、 結合比較演算子 <=>の追加です。これは、宇宙船演算子とも呼ばれます。 私は偏見があるように見えるかもしれませんが、それは本当にクールで、 >演算子と<演算子によく合います。

strcmp()またはversion_compare()ように効果的に機能し、左のオペランドが右より小さい場合は-1、等しい場合は0、左が右より大きい場合は1を返します。 関数との主な違いは、プリミティブだけでなく、任意の2つのオペランドで使用できることです。

最も一般的な使用方法は、ソートバックコールバックです。

 // Pre Spacefaring^W PHP 7 function order_func($a, $b) { return ($a < $b) ? -1 : (($a > $b) ? 1 : 0); } // Post PHP 7 function order_func($a, $b) { return $a <=> $b; } 

次へ


最も重要な動作の不整合のいくつかを分析し、PHP7の2つの新機能に注目しました。

次の投稿では、PHP7のその他の6つの優れた技術革新について見ていきます。

PSそして、待っている間に、PHP7で最も予想されることについて考えを共有してみませんか? それとも、私は言語で見たくないものがありますか?

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


All Articles