2015年のPHPの世界で最もエキサイティングなイベントの1つは、PHP7のリリースでした。最新のメジャーバージョンであるPHP5のリリースから10年後、PHP 7は、大きな前進とともに、多数の新機能とパフォーマンスの更新を導入します。 。
ただし、古い古い機能も削除されるため、互換性のギャップが生じ、古いアプリケーションを新しいバージョンに移行することがより困難になります。このガイドは、PHP 7の上に既存のアプリケーションを移動したり、新しいアプリケーションを構築したりする場合に予想されることのクイックツアーとして役立つはずです。
最近PHPを使用していない場合は、PHP 6に何が起こったのか、なぜPHP5からPHP7にジャンプしたのか疑問に思われるかもしれません。簡単に言えば、PHP6は失敗でした。バージョン6の主な機能は、ネイティブ文字のサポートでした Unicode PHPは主にWeb開発で使用され、WebにはUnicodeが必要であるため、UnicodeをPHPに導入する動きは理にかなっています。
アイデアは、カーネル自体に完全なUnicodeサポートをもたらすことでした。それは言語に拡張された機能をもたらしたでしょう:使用する能力から 絵文字 変数名や関数名のように、強力な国際文字列関数にはばかげています。たとえば、別の言語で英語とは異なる大文字と小文字が使用されている場合や、中国語の名前を英語に変換する必要がある場合です。
残念ながら、この野心的な計画は予想よりも大きな問題であることが判明しました。コードベースのほとんどは、メジャー拡張とメジャー拡張の両方でUnicodeをサポートするように移植する必要があり、面倒で複雑でした。これは言語の他の機能の開発を遅らせ、多くの人を苛立たせました PHP開発者 過程の中で。追加のハードルが提示されたため、ネイティブUnicodeサポートの開発への関心が低下し、最終的にプロジェクトが放棄されました。
書籍や記事などのリソースはPHP6とそのUnicodeサポート用に作成されていたため、混乱を避けるために、新しいバージョンの名前はPHP7に変更されました。
とにかく、悲しい過去に十分苦しんでいるので、PHP7がパーティーに何をもたらすか見てみましょう。
事実上すべてのアップデートで、マイナーなパフォーマンスの改善が期待されます。ただし、今回のPHPは、以前のバージョンに比べて大幅な改善をもたらし、パフォーマンスをPHP 7の最も魅力的な機能の1つにしています。これは、エンジン自体の内部コンポーネントに対処する「PHPNG」プロジェクトの一部です。 ゼンド。
内部データ構造をリファクタリングし、コンパイルを抽象構文木(AST)の形式でコーディングするための中間ステップを追加することにより、優れたパフォーマンスとより効率的なメモリ割り当てが実現します。数字自体は非常に有望に見えます。ザ・ ベンチマーク 実際のアプリケーションで実行すると、PHP7は平均してPHP5.6の2倍の速度であり、リクエスト中のメモリ消費量が50%少なくなり、PHP7はFacebookのHHVMJITコンパイラーの強力なライバルになります。いくつかの一般的なパフォーマンスを描いたこのZendインフォグラフィックを見てください CMSyフレームワーク 。
メモリ消費量の減少により、PHPを中心にマイクロサービスを構築する機会とともに、より小さなマシンでリクエストをより適切に処理できるようになります。内部の変更、特にASTの実装も、パフォーマンスをさらに押し上げる可能性のある将来の最適化の可能性を開きます。 JITコンパイラの新しい内部実装は、将来のバージョンで検討されています。
PHP 7には、新しい構文機能が付属しています。これらは言語自体の機能を拡張するものではありませんが、コードをより快適に記述し、見やすくするためのより優れた、またはより簡単な方法を提供します。
これで、同じ名前空間から発生したクラスのインポート宣言を「use」行でグループ化できます。これは、宣言を意味のある方法で整列するか、ファイルに数バイトを保存するのに役立ちます。
use FrameworkModuleFoo; use FrameworkModuleBar; use FrameworkModuleBaz;
PHP 7では、次のものを使用できます。
use FrameworkModule{Foo, Bar, Baz};
または、多重線形スタイルを好む場合:
use FrameworkModule{ Foo, Bar, Baz };
これにより、別の変数が実際に設定されている場合に、別の変数の変数に値を割り当てたいというPHPプログラミングの一般的な問題が解決されます。それ以外の場合は、これとは異なる値を指定してください。これは通常、ユーザー入力を操作するときに使用されます。
PHP 7より前:
if (isset($foo)) { $bar = $foo; } else { $bar = 'default'; // we would give $bar the value 'default' if $foo is NULL }
PHP 7以降:
$bar = $foo ?? 'default';
これは、いくつかの変数と連鎖させることもできます。
$bar = $foo ?? $baz ?? 'default';
宇宙船オペレーターは、1.0または-1を返すことにより、2つの値が等しいかどうかだけでなく、どちらが大きいかを示す3者間比較を可能にします。
ここでは、値の違いに応じてさまざまなアクションを実行できます:
switch ($bar $foo) { case 0: echo '$bar and $foo are equal'; case -1: echo '$foo is bigger'; case 1: echo '$bar is bigger'; }
比較される値は、整数、浮動小数点数、文字列、さらには配列にすることができます。 ドキュメントをチェックして、さまざまな値が互いにどのように比較されるかを理解してください。
しかしもちろん、PHP7はエキサイティングな新機能ももたらします。
PHP 7は、4つのスカラー型を追加することにより、メソッド(クラス、インターフェイス、および配列)内の以前の型のパラメーターの宣言を拡張します。 整数 (int
)、 フロート ( float
)、 ブール値 (bool
)および 文字列 ( string
)可能なパラメータタイプとして。
また、オプションで、返されるメソッドと関数の種類を指定できます。サポートされているタイプは、* bool *、* int *、* float *、* string *、* array *、* callable *、* Class *または* Interface * name、* self *、および* parent *(クラスメソッドの場合)です。
Clase Calculadora { // Declaramos que los parámetros proporcionados son del tipo entero Función Pública addTwoInts (int $ x, int $ y): int { Retorno $ x + $ y; // También decimos explícitamente que este método devolverá un entero } }
型宣言により、より堅牢なアプリケーションの構築が可能になり、関数からの誤った値の受け渡しを回避できます。その他の利点には、静的コードパーサーとIDEが含まれます。これらは、次の場合にコードベースのより良いビューを提供します。 DocBlocks。
PHPは弱い型付け言語であるため、パラメーターと戻り値の型の特定の値がコンテキストに基づいて出力されます。タイプint
の宣言されたパラメーターを持つ関数に値「3」を渡すと、インタープリターはそれを整数として受け入れ、エラーをスローしません。これが必要ない場合は、modo estricto
を有効にすることができます。 declarar
のディレクティブを追加します。
Declarar (tipos_estrictos = 1);
グローバルオプションはコードリポジトリをグローバルな厳密さで構築されたものに分割するため、これはファイルごとに設定されます に 両方のコードを組み合わせると、予期しない動作が発生します。
エンジン例外の追加により、の終了につながる可能性のある致命的なエラー 脚本 それらは簡単にキャプチャして処理できます。
存在しないメソッドの呼び出しなどのエラーはスクリプトを終了しませんが、代わりに、catchテストブロックで処理できる例外をスローします。これにより、アプリケーションのエラー処理が改善されます。これは、特定の種類のアプリケーション、サーバー、および デーモン 、致命的なエラーは再起動が必要になるため。致命的なエラーによってテストスイート全体が強制終了されるため、PHPUnitでのテストもより便利です。エラーではなく例外がテストケースによって処理されます。
PHP 7は、発生する可能性のあるエラーのタイプに基づいて、いくつかの新しい例外クラスを追加します。バージョン間の互換性を維持するために、新しいインターフェイスが追加されましたThrowable
これは、エンジンとユーザーの例外から実装できます。これは、基本例外クラスを拡張するためのエンジン例外を回避するために必要であり、以前は存在しなかった古いコードキャプチャ例外が発生していました。
PHP 7より前は、これによりスクリプトが致命的なエラーで終了していました。
try { thisFunctionDoesNotEvenExist(); } catch (EngineException $e) { // Clean things up and log error echo $e->getMessage(); }
匿名クラスは、短期間の単純なインスタンスで使用できる匿名関数のいとこです。匿名クラスは、通常のオブジェクトと同じように簡単に作成して使用できます。これはドキュメントからの例です。
PHP7より前
php class MyLogger { public function log($msg) { print_r($msg . '
'); } } $pusher->setLogger( new MyLogger() );
匿名クラスの場合:
php $pusher->setLogger(new class { public function log($msg) { print_r($msg . '
'); } });
匿名クラスは、単体テスト、特にオブジェクトとサービスのテストに役立ちます。これにより、模倣したいインターフェイスを提供する単純なオブジェクトを作成することで、重いライブラリやフレームワークが複製されるのを防ぐことができます。
暗号的に安全な整数と文字列を生成するための2つの新しい関数が追加されました。
random_bytes(int $len);
長さ$len
のランダムな文字列を返します。
php random_int(int $min, int $max);
$min
と$max
の間の数値を返します。
他の多くの言語とは異なり、PHP 7より前は、PHPには文字列リテラルのUnicodeコードをエスケープする方法がありませんでした。この機能は、エスケープシーケンス ` u 'を追加して、UTF-8コードコードを使用してこれらの文字を生成します。これは、文字を直接挿入するよりも優れており、非表示の文字や、同じグラフィック表現を持つが意味が異なる文字をより適切に処理できます。
echo 'u{1F602}'; // outputs ‚
これにより、動作が変わるため、既存のコードがシーケンス ` u 'で壊れることに注意してください。
PHPのジェネレーターには、いくつかの優れた追加機能もあります。ジェネレーターには、反復後に最終値を生成できるようにするために使用できるreturnステートメントがあります。これを使用して、ジェネレーターがエラーなしで実行されたことを確認し、ジェネレーターを呼び出したコードがさまざまなシナリオを適切に処理できるようにします。
また、ジェネレーターは他のジェネレーターから式を返し、レンダリングすることができます。これにより、複雑な操作をより単純でモジュール式のユニットに分割できます。
function genA() { yield 2; yield 3; yield 4; } function genB() { yield 1; yield from genA(); // 'genA' Se llama aquí e itera sobre yield 5; return 'success'; // Este es un resultado final que podemos comprobar más tarde } foreach (genB() as $val) { echo '
$val'; // Esto emitirá los valores 1 a 5 para} $genB()->getReturn(); // Esto debería devolver el 'éxito' cuando no hay errores.
期待はafirmar ()
の改善です下位互換性を維持しながら。これらは、本番コードでゼロコストのアサーションを許可し、アサーションが失敗したときにカスタム例外をスローする機能を提供します。これは、開発中に役立ちます。
Afirmar ()
PHP 7では言語構造になります。アサーションは、開発環境とテスト環境でのみデバッグ目的で使用する必要があります。その動作を構成するために、2つの新しいディレクティブが提供されています。
zend.afirmación
-1
:コードの生成と実行(開発モード)(デフォルト)-0
:コードを生成しますが、実行時にジャンプします--1
:コードを生成しないためコストがゼロになります(生産モード)afirmación.excepción
-1
:アサーションが失敗したときにスローし、例外として提供されたオブジェクトをスローするか、例外が提供されなかった場合は新しい* ErrorAffirmation *オブジェクトをスローします-0
:説明されているように* Throwable *を使用または生成します上記ですが、オブジェクトをスローするのではなく、そのオブジェクトに基づいて警告を生成するだけです(PHP 5の動作と互換性があります)メジャーリリースの導入により、古い機能を変更/更新したり、古すぎると見なされたり、しばらく古くなっている場合は削除したりすることができます。このような変更により、古いアプリケーションで互換性が損なわれる可能性があります。
このバージョンから発生するもう1つの問題は、依存している重要なライブラリとフレームワークが最新バージョンをサポートするように更新されていない可能性があることです。 PHPチームは、新しい変更をできるだけ遅くし、新しいバージョンへの移行をできるだけ簡単にするように努めました。新しい、より最新のアプリケーションは、新しいバージョンへの移行が容易であることがわかるはずですが、古いアプリケーションは、メリットがコストを上回るかどうかを判断する必要があり、アップグレードしないことを選択する可能性があります。
ほとんどの休憩は軽微であり、簡単に軽減できますが、他の休憩はより多くの労力と時間を必要とする場合があります。基本的に、PHP 7をインストールする前にアプリケーションに古い警告があった場合は、エラーが発生し、解決されるまでアプリケーションが破損する可能性があります。警告されましたよね?
最も重要なことは、古くて非推奨のSAPIが拡張機能として削除されたことですmysql
(しかし、そもそもこれを使うべきではありませんよね?)。拡張機能と削除されたハイライトの完全なリストについては、このRFCを確認できます。 ここに Y ここに 。
また、他のSAPIはPHP7に移植されています。
この更新により、変数-変数構造の一貫性を優先するいくつかの変更が行われました。これにより、変数を使用したより高度な式が可能になりますが、以下に示すように、他の場合には動作に変更が加えられます。
// old meaning // new meaning $$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz'] $foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz'] $foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']() Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()
これは、このような値にアクセスしたアプリケーションの動作を壊します。一方、あなたはこのようないくつかのきちんとしたことをすることができます:。
// Nested () foo()(); // Calls the return of foo() $foo->bar()(); // IIFE syntax like JavaScript (function() { // Function body })(); // Nested :: $foo::$bar::$baz
開始/終了タグ `` ,
,
... `は削除され、無効になります。それらを有効なものと交換するのは簡単なはずですが、とにかく奇妙なことをしていますか?
パラメータや戻り値の型クラスなどの追加の結果として、インターフェイスとトレイトは次の名前を持つことができなくなりました。
--bool --int --float --string --null --true --false
これらは、既存のアプリケーションとそれらを使用するライブラリに障害を引き起こしますが、簡単に修正できるはずです。また、エラーは発生せず有効ですが、将来の使用のために予約されているため、以下は使用しないでください。
オブジェクト-混合-数値
それらの使用を控えることで、将来それらを変更する手間を省くことができます。互換性を損なう可能性のある変更の完全なリストについては、これをチェックしてください 資料 。
使用することもできます php7cc 、コードをチェックし、PHP 7に移行した場合に発生する可能性のある潜在的な問題を検出できます。ただし、もちろん、PHP7をインストールして自分でチェックするよりも良い方法はありません。 ##潜在的なPHP互換性の問題### PHP7インフラストラクチャの互換性
データを視覚的に表現するための便利な方法
多くのホスティングサービスがPHP7のサポートの追加を開始しました。これは、パフォーマンスの向上により、ハードウェア上のクライアントWebサイトの数を増やし、運用コストを削減し、マージンを増やすことができるため、共有ホスティングプロバイダーにとって朗報です。顧客自身に関しては、これらの条件下であまりブーストを期待するべきではありませんが、公平を期すために、共有ホスティングはとにかくパフォーマンス指向のオプションではありません。
一方、仮想プライベートサーバーまたは専用サーバーによって提供されるサービスは、このパフォーマンスヒットのメリットを最大限に活用します。のいくつかのサービス PaaS なので Heroku 最初からPHP7をサポートしていましたが、他のサービスなど AWS Beanstalk Y OpenShift de Oracle 、彼らは遅れています。 PaaSプロバイダーのWebサイトをチェックして、PHP 7がすでにサポートされているかどうか、またはサポートが近い将来に行われるかどうかを確認してください。もちろん、IaaSプロバイダーを使用すると、ハードウェアを制御してPHP 7をインストールできます(または、好みに応じてコンパイルできます)。 PHP 7パッケージが、主要なIaaS環境で利用できるようになりました。
インフラストラクチャの互換性に加えて、潜在的なソフトウェアの互換性の問題にも注意する必要があります。 WordPress、Joomla、Drupalなどの人気のあるコンテンツ管理システムは、最新バージョンでPHP7のサポートを追加しました。のような重要なフレーム symfony Laravelも完全なサポートを楽しんでいます。しかし、それは注意の言葉の時間です。このサポートは、プラグイン、プラグイン、パッケージ、またはCMSやフレームワークがそれらを呼び出す形式のサードパーティコードには拡張されません。彼らは互換性の問題に苦しんでいる可能性があり、すべてがPHP7に対応していることを確認するのはあなたの責任です。
アクティブで保守されているリポジトリの場合、これは問題にはなりません。ただし、PHP 7のサポートがない古いメンテナンスフリーのリポジトリでは、アプリケーション全体が使用できなくなる可能性があります。
PHP 7バージョンは、古くて古いコードを削除し、将来の新機能とパフォーマンスの更新への道を開きました。また、PHPはまもなく追加のパフォーマンス最適化を取得する予定です。いくつかの下位互換性のギャップにもかかわらず、ほとんどの問題は簡単に解決できます。ライブラリとフレームワークは現在、コードをPHP 7に移行しているため、最新バージョンが利用可能になっています。自分で結果を見てみることをお勧めします。たぶん、あなたのアプリケーションはすでにサポートされており、PHP7の使用と恩恵を受けるのを待っています。
関連: PHP開発者が犯す最も一般的な10の間違いのリスト>