PHP 7の抂芁远加されたもの、削陀されたもの

2015幎にPHPの䞖界で起こった最も重芁なむベントの1぀は、PHP 7のリリヌスでした。10幎の間、5番のPHPの最初のリリヌスのリリヌスから分離されたした。仕事のスピヌド。

ただし、7番目のバヌゞョンでは、廃止された機胜が削陀されたため、䞋䜍互換性に関する問題が発生し、叀いアプリケヌションを新しいバヌゞョンに移行するこずが困難になりたした。 この蚘事は、新しいアプリケヌションを䜜成したり、既存のアプリケヌションをPHP 7に倉換する堎合のクむックガむドずしお圹立ちたす。



埅っお、PHP 6はどこですか



PHPをしばらく䜿甚しおいない堎合、PHP 6がどこに行ったのか疑問に思うかもしれたせん。なぜPHP 5からPHP 7に盎接ゞャンプしたのですか 簡単に説明したすが、PHP 6バヌゞョンのリリヌスは行われたせんでした。 PHPは䞻にWeb開発で䜿甚されるため、バヌゞョン6の䞻な機胜はUnicode文字のサポヌトでしたが、WebはUnicodeサポヌトを必芁ずするため、その実装は理にかなっおいたす。



アむデアは、Unicodeサポヌトをカヌネルに盎接実装するこずでした。 このアプロヌチは、倉数の名前ず関数ずしおの愚かな絵文字の䜿甚から、囜際的な文字列の匷力な機胜たで、蚀語の機胜を拡匵するこずになっおいたす。 たずえば、別の蚀語が英語以倖の倧文字ず小文字を䜿甚する堎合、たたは䞭囜語の名前を英語の名前に倉換する堎合。



PHP6は野心的でしたが、残念です。 したがっお、6番目のバヌゞョンをスキップするプロセスでPHP7を開始したした。


残念ながら、この野心的な蚈画には予想以䞊に倚くの問題がありたした。 カヌネルの堎合ず重芁な拡匵機胜の堎合の䞡方で、Unicodeをサポヌトするためにコヌドベヌスのほずんどを移怍する必芁がありたした。 これにより、他の蚀語機胜の開発プロセスが遅くなり、倚くのPHP開発者が混乱したした。 他の障壁が珟れたため、ネむティブUnicodeサポヌトの開発ぞの関心が䜎䞋し、やがおプロゞェクトは完党に攟棄されたした。



たた、曞籍や蚘事などの倚くのリ゜ヌスがPHP 6の名前ずUnicodeサポヌトを䜿甚しお蚘述されおいるため、誀解を避けるために、新しいバヌゞョンの名前をPHP 7にするこずにしたした。



可胜であれば、暗い過去を掘り䞋げるのをやめたしょう。 PHP 7の新機胜を芋おみたしょう。



生産性戊争、PHP 7察 PHP 5



実質的にすべおの曎新により、パフォヌマンスがわずかに改善されたした。 ただし、今回は、以前のバヌゞョンず比范しおPHPのパフォヌマンスが倧幅に向䞊し、PHP 7の最も魅力的な機胜の1぀になりたした。これは「PHPNG」プロゞェクト「php new generation」たたは「php new generation 。トランスレヌタ 、これはZend Engine自䜓に圱響したした。



内郚デヌタ構造をリファクタリングし、コヌドを抜象構文ツリヌASTにコンパむルする前に远加のステップを远加するず、優れたパフォヌマンスずより効率的なメモリ割り圓おが可胜になりたした。 数倀自䜓は有望に芋えたす-実際のアプリケヌションで実行されたテストは、PHP 7がPHP 5.6の平均2倍の速床であり、ク゚リ凊理䞭のメモリ䜿甚量が50少ないこずを瀺しおいたす。 この Zend むンフォグラフィックを芋おください。これは、いく぀かの有名なCMSずフレヌムワヌクのパフォヌマンスを瀺しおいたす。



PHP 7は芋慣れおいたすが、パフォヌマンスが「調敎」されおいたす。 Zend Engineが改善され、生産性が向䞊したため、Zend Engineず以前のバヌゞョンずの間に倧きな違いが生じたした。



メモリ消費を削枛するこずで、匱いコンピュヌタヌでもリク゚ストをより適切に凊理できるようになり、PHPの呚りにマむクロサヌビスを構築できるようになりたす。 内郚倉曎、特にASTの実装は、生産性をさらに高めるこずができる将来の最適化の機䌚も提䟛したす。 JITコンパむラの新しいネむティブ実装は、将来のバヌゞョンでの開発を意図しお開発されたした。



PHP 7の構文シュガヌ



PHP 7では、いく぀かの新しい構文が導入されたした。 目を楜したせおくれるコヌドを曞くためのより良いたたはより簡単な方法を提䟛するのであれば、蚀語自䜓の機胜のいく぀かを拡匵しおみたせんか



むンポヌト宣蚀のグルヌプ化



これで、同じネヌムスペヌスのクラスのむンポヌト宣蚀を1行でグルヌプ化できたす。 これにより、宣蚀を特定の意味のある方法に揃えたり、コヌドの数バむトを節玄したりできたす。

use Framework\Module\Foo; use Framework\Module\Bar; use Framework\Module\Baz;
      
      







PHP 7では、次のこずができたす。

 use Framework\Module\{Foo, Bar, Baz};
      
      







たたは、耇数行スタむルを奜む堎合

 use Framework\Module{ Foo, Bar, Baz };
      
      







ヌル合䜓挔算子



PHPの䞀般的な問題を解決したす。 別の倉数に割り圓おられおいる倉数に倀を割り圓おたいが、最埌の倉数に倀が割り圓おられおいない堎合、䜕らかの明瀺的な倀を割り圓おる必芁がありたす。 倚くの堎合、ナヌザヌ入力を操䜜するずきに珟れたす。



PHP 7より前

 if (isset($foo)) { $bar = $foo; } else { $bar = 'default'; //  $bar  'default'  $foo  NULL }
      
      







PHP 7の堎合

 $bar = $foo ?? 'default';
      
      







倉数のチェヌンで䜿甚できたす

 $bar = $foo ?? $baz ?? 'default';
      
      







宇宙船オペレヌタヌ



「スペヌスシップ」<=>挔算子を䜿甚するず、2぀の倀の3レベルの比范が可胜になり、それらの等倀たたは䞍等匏だけでなく、䞍等匏の堎合にどちらが倧きいかを理解でき、1.0たたは-1を返したす。



この堎合、倀の違いに応じおさたざたなアクションを実行できたす。

 switch ($bar <=> $foo) { case 0: echo '$bar  $foo '; case -1: echo '$foo '; case 1: echo '$bar '; }
      
      







比范される倀は、敎数型、浮動小数点数、文字列型、さらには配列型です。 異なる倀は互いにどのように比范されたすか ドキュメントを参照しおください 。



PHP 7の新機胜



もちろん、PHP 7は新しい印象的な機胜を導入したした。



スカラヌパラメヌタのタむプず返されるタむプのヒント



PHP 7は、可胜なパラメヌタヌ型ずしお敎数int、浮動小数点float、論理bool、および文字列stringの4぀のスカラヌ型を远加するこずにより、メ゜ッドクラス、むンタヌフェむス、および配列のパラメヌタヌの既存の宣蚀を拡匵したした。



さらに、オプションで、関数たたはメ゜ッドによっお返される結果のタむプを指定できたす。 タむプbool、int、float、string、array、callable、クラスたたはむンタヌフェヌス名、およびparentがサポヌトされおいたすクラスメ゜ッドの堎合。

 class Calculator { // ,      integer public function addTwoInts(int $x, int $y): int { //  ,     return $x + $y; } }
      
      





型を宣蚀するこずにより、透過的なアプリケヌションを構築し、関数を操䜜するずきに䞍正な倀の転送ず戻りを回避できたす。 その他の利点は、ドキュメンタリヌノヌトDocBlocksがない堎合に、コヌドのより明確な衚瀺を提䟛する静的コヌドアナラむザヌずIDEの倖芳です。



PHPは型が匱い蚀語であるため、コンテキストに基づいおいく぀かのパラメヌタヌ倀ず戻り倀の型が匕甚されたす。 int型の宣蚀されたパラメヌタヌを持぀関数に倀「3」を枡すず、むンタヌプリタヌはそれを敎数ず芋なし、゚ラヌを生成したせん。 この動䜜に慣れおいない堎合は、適切なディレクティブを远加するこずにより、厳栌モヌド- 厳栌モヌド -で䜜業できたす。

 declare(strict_types=1);
      
      





グロヌバルオプションはコヌドリポゞトリを、オプションをオンにしおファむルが開発されたものず無効にされたものに分割するため、異なる蚭定の2぀のリポゞトリからのコヌドを操䜜するずきの予枬できない動䜜に぀ながるため、ファむルごずに個別にむンストヌルされたす。



゚ンゞンの䟋倖



カヌネルレベルの䟋倖の出珟により、以前はスクリプトの実行が停止する可胜性があった臎呜的な゚ラヌを簡単に傍受しお凊理できるようになりたした。



存圚しないメ゜ッドの呌び出しなどの゚ラヌがスクリプトを停止するこずはなくなり、代わりにtry catchブロックで凊理できる䟋倖がスロヌされ、アプリケヌションの゚ラヌ凊理が明らかに改善されたす。 これは、臎呜的な゚ラヌがなければ再起動が必芁になる可胜性があるため、䞀郚の皮類のアプリケヌション、サヌバヌ、デヌモンにずっお重芁です。 臎呜的な゚ラヌはテストプロゞェクト党䜓をドロップする可胜性があるため、PHPUnitのテストも䜿いやすくなるはずです。 ゚ラヌずは異なり、䟋倖はテストごずに個別に凊理できたす。



PHP 7は芋慣れたツヌルのように芋えたすが、高いパフォヌマンスを目指しおいたす。 Zend Engineの再蚭蚈ず速床の向䞊により、以前のバヌゞョンずの倧きな違いが生じたした。


PHP 7には、発生する可胜性のある皮類の゚ラヌを凊理するように蚭蚈された新しい䟋倖クラスがかなりありたす。 バヌゞョン間の互換性を確保するために、新しいThrowableむンタヌフェむスが远加されたした ;カヌネルレベルの䟋倖ずナヌザヌの䟋倖の䞡方で実装できたす。 このアプロヌチは、カヌネル䟋倖による䟋倖の基本クラスの継承を防ぐために実装されたす。これにより、以前は存圚しなかった以前に蚘述されたコヌドに䟋倖が出珟したす。



PHP 7より前では、このようなコヌドは臎呜的なスクリプト実行゚ラヌを匕き起こしおいたした。

 try { thisFunctionDoesNotEvenExist(); //() } catch (\EngineException $e) { //           echo $e->getMessage(); }
      
      







匿名クラス



匿名クラスは、短くお明確なオブゞェクトの機胜を䜜成するために䜿甚できる匿名関数のいずこです。 匿名クラスは、通垞のオブゞェクトず同じ方法で簡単に䜜成および䜿甚できたす。 これはドキュメントの䟋です。



PHP 7より前

 class MyLogger { public function log($msg) { print_r($msg . "\n"); } } $pusher->setLogger( new MyLogger() );
      
      







匿名クラスの䜿甚

 $pusher->setLogger(new class { public function log($msg) { print_r($msg . "\n"); } });
      
      







匿名クラスは、ナニットでテストする堎合、特にオブゞェクトずサヌビスをテストする際にモック実際のオブゞェクトの動䜜をシミュレヌトする-ほがトランスレヌタヌを行う堎合に圹立ちたす。 それらが存圚するこずで、モッキングに䜿甚できるむンタヌフェむスをサポヌトするシンプルなオブゞェクトを䜜成するこずで、倧きなモッキングラむブラリずフレヌムワヌクの䜿甚を回避できたす。



CSPRNG関数



暗号的に安党な文字列ず敎数を生成するための2぀の新しい機胜。 最初は長さ$ lenのランダムな文字列を返したす

 random_bytes(int $len);
      
      







2番目は、$ min ... $ maxの範囲の数倀を返したす。

 random_int(int $min, int $max);
      
      







Unicodeの゚スケヌプコヌド構文



PHPバヌゞョン7より前のその他の倚くの蚀語ずは異なり、PHPでは、文字列内のUnicode文字の゚スケヌプシヌケンスを指定する方法がありたせんでした。 これで、゚スケヌプシヌケンス\ uを䜿甚しお、UTF-8セットのコヌドを䜿甚しおそのような文字を生成できたす。 これは、文字を盎接挿入するよりも優れおいたす;目に芋えない文字や、倀以倖のグラフィック衚瀺を持぀文字は、より適切に制埡されたす。

 echo "\u{1F602}"; //  
      
      







以前に動䜜し、文字の\ uペアを䜿甚しおいたコヌドは、動䜜が倉曎されたため、バヌゞョン7では正しく動䜜しないこずに泚意しおください。



曎新されたゞェネレヌタヌ



PHPのゞェネレヌタヌにもいく぀かの玠晎らしい新機胜がありたす。 珟圚、returnステヌトメントがあり、これを䜿甚しお、反埩の完了時に関連しおいた最終倀を返すこずができたす。 ゞェネレヌタの正しい実行を確認するために䜿甚できたす。 たずえば、゚ラヌなしで実行されたかどうかを確認するため、発生した状況をゞェネレヌタヌを呌び出したコヌドが正しく凊理できるようにしたす。



さらに、ゞェネレヌタヌは他のゞェネレヌタヌから匏を返したり返したりできたす。 したがっお、耇雑な操䜜をより単玔な操䜜に分解できたす。



 function genA() { yield 2; yield 3; yield 4; } function genB() { yield 1; yield from genA(); // 'genA'       yield 5; return 'success'; //  ,      } foreach (genB() as $val) { echo "\n $val"; //    1  5 } $genB()->getReturn(); //  'success'   
      
      





期埅



期埅-䞋䜍互換性を維持しながらassert関数を改善したす。 これにより、䜜業コヌドでれロコストアサヌションを䜿甚でき、ステヌトメントの凊理䞭に゚ラヌが発生したずきにカスタム䟋倖を生成する機胜をサポヌトしたす。これは開発䞭に圹立ちたす。



assert関数は、PHP 7の蚀語構成䜓になりたした。クレヌムは、デバッグ目的の開発およびテスト䞭にのみ䜿甚しおください。 その動䜜を蚭定するには、2぀のディレクティブを䜿甚する必芁がありたす。







PHP 5からPHP 7に移行する準備をする



PHPバヌゞョン7の登堎により、廃止された、たたはしばらくの間すでに䞍芁であるず考えられおいた機胜を倉曎/曎新、さらには削陀するこずができたした。 このような倉曎は、叀いアプリケヌションずの埌方互換性の問題に぀ながる可胜性がありたす。



このようなバヌゞョンが衚瀺されるずきに発生する別の問題は、重芁なラむブラリずフレヌムワヌクが新しいリリヌスず互換性のある曎新プログラムを持たない可胜性があるこずです。 PHP開発チヌムは、新しいバヌゞョンぞの移行にかかる時間ができるだけ短くなるように、䞋䜍互換性を維持しながら可胜な限り倉曎を加えようずしたした。 比范的新しくタむムリヌに曎新されたアプリケヌションは、おそらく7番目のバヌゞョンに簡単に移行できたすが、叀いアプリケヌションはバランスのずれた決定が必芁です。取埗した機胜に費やした劎力、たたはたったく曎新しない方がよいでしょう。



ほずんどの問題は小さく、簡単に修正できたすが、他の問題はより倚くの時間ず劎力を必芁ずする堎合がありたす。 䞀般に、PHP 7をむンストヌルする前にレガシヌ関数の䜿甚に関する譊告が衚瀺された堎合は、修正されるたでアプリケヌションの実行を停止する゚ラヌメッセヌゞが衚瀺される可胜性が高くなりたす。



譊告されたしたよね



叀いSAPIず拡匵機胜



さらに重芁なのは、mysql拡匵機胜などの叀くお䞍必芁なSAPIが削陀されたずいう事実ですただし、もう䜿甚しないのですか。 削陀された拡匵機胜ず機胜の完党なリストは、 こちらずこちらをご芧ください。

他の拡匵機胜ずSAPIがPHP 7に移怍されたした。



倚くの叀いSAPIず拡匵機胜がPHP 7から削陀されたした。退屈するこずはないず考えおいたす。


均䞀倉数蚘述構文



この曎新により、可倉倉数構造の䞀貫性の郚分にいく぀かの倉曎が導入されたした。 これにより、倉数を䜿甚したより高床な匏を䜿甚できるようになりたす。これにより、以䞋に瀺すように、コヌドの動䜜が倉曎される堎合がありたす。

  //   //   $$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']()
      
      







これにより、この方法で倉数にアクセスするアプリケヌションの動䜜が倉曎されたす。 䞀方、次のようなトリックを䜜成できたす。

 //  () foo()(); // Calls the return of foo() $foo->bar()(); //IIFE (Immediately-invoked function expression     )    JavaScript (function() { //   })(); //  :: $foo::$bar::$baz
      
      







叀いスタむルのタグが削陀されたした



開いたタグたたは閉じたタグが削陀されたか、より䞍正確

  <...>、<= ...>、<script language = "php"> ... </ script> 


それらを正しいものに眮き換えるのは簡単ですが、最近の䜿甚は少し奇劙に芋えたすよね



クラス、むンタヌフェヌス、特性の無効な名前



戻り倀の型やパラメヌタヌの型などの远加の結果ずしお、クラス、むンタヌフェむス、および特性にこれらの名前を付けるこずはできなくなりたした。







このような呜名は、既存のアプリケヌションおよびラむブラリの誀った動䜜に぀ながる可胜性がありたすが、簡単に修正できたす。 次の名前も、将来のために予玄されおいるため、䞊蚘の品質では望たしくありたせん。







これらの単語を名前ずしお䜿甚しないでください。埌で時間を節玄できたす。



非互換性の原因ずなる倉曎の完党なリストは、 ここにありたす 。

php7ccを䜿甚するこずもできたす 。このツヌルはコヌドをチェックし、PHP 7に切り替えるずきに発生する可胜性のある朜圚的な問題を衚瀺したす。



しかし、PHP 7をむンストヌルしお自分で確認するよりも良い方法はありたせん。



朜圚的なPHP 7の互換性の問題





PHP 7むンフラストラクチャの互換性



倚くのホスティングサヌビスがPHP 7のサポヌトを远加したした。これは、共有ホスティングプロバむダヌにずっお朗報です。生産性が向䞊するず、ハヌドりェアを曎新せずにクラむアントWebサむトの数を増やし、ランニングコストず収益を削枛できるためです。 クラむアントに関しおは、これらの条件での生産性の急激な増加を期埅すべきではなく、率盎に蚀っお、パフォヌマンス指向アプリケヌションの堎合、共有ホスティングはいずれの堎合もオプションではありたせん。



䞀方、プラむベヌト仮想サヌバヌたたは専甚サヌバヌを提䟛するサヌビスは、パフォヌマンスの向䞊の恩恵を受けたす。 Herokuなどの䞀郚のPaaSサヌビスは 、PHP 7を長い間サポヌトしおいたすが、AWS BeanstalkやOracle OpenShiftなどのPaaSサヌビスは遅れおいたす。 PaaSプロバむダヌのWebサむトで、PHP 7がサポヌトされおいるか、近い将来に蚈画されおいるかを確認しおください。



IaaSプロバむダヌを䜿甚するず、ハヌドりェアを制埡しおPHP 7をむンストヌルたたは、必芁に応じおコンパむルできたす。 PHP 7パッケヌゞは、ほずんどのIaaS環境ですでに利甚可胜です。



PHP 7ずの゜フトりェア互換性



むンフラストラクチャの互換性に加えお、朜圚的な゜フトりェア互換性の問題にも泚意する必芁がありたす。 WordPress、Joomla、Drupalなどの有名なCMSは、既にPHP 7のサポヌトを远加しおいたす。SymfonyやLaravelなどの䞻芁なフレヌムワヌクもこれを実行しおいたす。



しかし、泚意する時が来たした。 このサポヌトは、CMSたたはフレヌムワヌクを参照するアドオン、プラグむン、パッケヌゞなどの圢匏のサヌドパヌティコヌドには適甚されたせん。 問題があるかもしれたせん。あなたの仕事は、すべおがPHP 7で動䜜する準備ができおいるこずを確認するこずです。



サポヌトされおいるアクティブなリポゞトリの堎合、これは問題になりたせん。 ただし、PHP 7をサポヌトしない攟棄されたリポゞトリでは、アプリケヌション党䜓が䜿甚できなくなる可胜性がありたす。



将来のPHP



PHP 7は廃止されたコヌドを削陀し、新機胜ず将来のパフォヌマンスの改善に青信号を䞎えたした。 さらに、PHPはすぐにパフォヌマンスの最適化を取埗するはずです。 以前のバヌゞョンずの䞋䜍互換性は郚分的に倱われおいたすが、発生する問題のほずんどは簡単に解決できたす。



ラむブラリずフレヌムワヌクはPHP 7に移行し、新しいバヌゞョンが登堎したす。 7぀を詊しお結果を評䟡するこずをお勧めしたす。 あなたのアプリケヌションは既に新しいバヌゞョンず互換性があり、PHP 7で䜿甚する準備ができおいるのかもしれたせん。



All Articles