これは、待望の PHP 7 シリーズの 2 番目の記事です。最初の記事を読むには、ここをクリックしてください。この記事は、OneAPM エンジニアによって編集および編集されました。
おそらく、PHP 7 の大きなリリースが今年行われることはすでにご存じでしょう。それでは、新しいバージョンの新機能と改善点を見てみましょう。
このシリーズの最初の記事では、PHP 7 の最も重要な非互換性修正のいくつかと 2 つの新機能を紹介しました。この記事では、PHP 7 のさらに 6 つの優れた機能を見ていきます。
新しく追加されたエスケープ文字 ?? u を使用すると、PHP 文字列内で Unicode 文字コード ポイント (16 進数) を明示的に指定できます:
ここで使用される構文は u{CODEPOINT} です。たとえば、この緑色のハートの形 ? は、PHP 文字列 __"u{1F49A}"__ として表すことができます。
もう 1 つの新しい演算子?? Null マージ演算子 ?? は、実際には伝説的な三項演算子です。 Null でない場合は左のオペランドが返され、それ以外の場合は右のオペランドが返されます。
ポイントは、左のオペランドが存在しない変数の場合、それに気付かないということです。これは isset() に似ており、 ?: の短い三項演算子とは異なります。
この演算子を連鎖させて、指定されたコレクションの最初の非 null 値を返すこともできます。
$config = $config ?? $this->config ?? static::$defaultConfig;
以前は、PHP 5.4 に Closure->bindTo() と Closure::bind() を追加することで、$this とバインディングの呼び出しスコープを同時にまたは個別に変更できました。 , 繰り返しクロージャを作成します。
PHP 7 では、Closure->call() を通じて $this と呼び出しスコープを同じオブジェクトにバインドすることで、呼び出し時に上記の機能を実現する便利な方法が追加されました。このメソッドは、次のようにオブジェクトを最初のパラメータとして受け取り、次に他のパラメータをクロージャに渡します:
class HelloWorld { private $greeting = "Hello";}$closure = function($whom) { echo $this->greeting . ' ' . $whom; }$obj = new HelloWorld();$closure->call($obj, 'World'); // Hello World
同じ名前空間から複数のクラスをインポートしたことがあり、IDE がそれを自動的に行うことができる場合, きっと幸せになれますよ。他の皆様のために、簡単にするために、PHP 7 にはグループ使用宣言が追加されました。これにより、複数の同様のインポートを迅速かつ明確に指定できます:
// Originaluse Framework\Component\SubComponent\ClassA;use Framework\Component\SubComponent\ClassB as ClassC;use Framework\Component\OtherComponent\ClassD;// With Group Useuse Framework\Component\{ SubComponent\ClassA, SubComponent\ClassB as ClassC, OtherComponent\ClassD};
use function と一緒に使用したり、定数インポートや関数インポートで const を使用したりすることもできます。混合インポートもサポートされています。
use Framework\Component\{ SubComponent\ClassA, function OtherComponent\someFunction, const OtherComponent\SOME_CONSTANT};
ジェネレーターには 2 つの大きな新機能があります。 1 つ目はジェネレーターの戻り式です。これを使用すると、ジェネレーターが完了 (正常に) したときに値を返すことができます。
PHP 7 より前では、値を返そうとするとエラーが発生していました。ただし、$generator->getReturn() を呼び出して戻り値を取得できるようになりました。
ジェネレーターがまだ戻っていない場合、またはキャッチされない例外がスローされた場合、$generator->getReturn() を呼び出すと例外がスローされます。
ジェネレーターが完了したが戻らなかった場合は null を返します。
例は次のとおりです:
function gen() { yield "Hello"; yield " "; yield "World!"; return "Goodbye Moon!";}$gen = gen();foreach ($gen as $value) { echo $value; }// Outputs "Hello" on iteration 1, " " on iterator 2, and "World!" on iteration 3echo $gen->getReturn(); // Goodbye Moon!
2 番目の機能はさらに魅力的です。ジェネレーター デリゲートです。これにより、配列、イテレータ、または別のジェネレータなど、それ自体を反復処理できる別の反復可能な構造体を返すことができます。
重要なのは、部分構造の反復は、再帰的構造ではなく、単一の平面構造のように、最も外側のプリミティブ ループによって実行されることです。
ジェネレーターにデータや例外を送信する場合も同様です。これらのデータまたは例外は、呼び出される直接コントロールと同様に、サブ構造に直接渡されます。
これは、次のような
各反復で、次の出力が行われます:
"Hello"
" "
"World! "
"Goodbye"
" "
"Moon!"
言及する価値のある 1 つの注意点は、部分構造は独自のキーを生成できるため、複数の反復で同じキーを返す可能性が完全にあります。これがあなたにとって重要な場合は、それを回避する方法を自分で見つける必要があります。
PHP では、致命的なエラーとキャッチ可能な致命的なエラーは常に処理不可能か、処理が困難です。しかし、内部例外を使用すると、これらのエラーの多くで例外がスローされる可能性があります。
致命的なエラーまたはキャッチ可能な致命的なエラーが発生した場合、例外がスローされるため、それを適切に処理できるようになりました。これを処理しないと、キャッチされない例外のような従来の致命的なエラーになります。
これらの例外は EngineException オブジェクトです。すべてのユーザー例外とは異なり、これらは Exception クラスを継承しません。これは、現在 Exception クラスをキャッチするコードが将来的に致命的なエラーをキャッチしないようにするためです。これにより、下位互換性が維持されます。
将来、従来の例外と内部例外の両方をキャッチしたい場合は、それらの新しい共有親クラス BaseException をキャッチする必要があります。
さらに、eval() で処理されたコード内の解析エラーは ParseException をスローし、型の不一致は TypeException をスローします。
例:
try { nonExistentFunction();} catch (\EngineException $e) { var_dump($e);}object(EngineException)#1 (7) { ["message":protected]=> string(32) "Call to undefined function nonExistantFunction()" ["string":"BaseException":private]=> string(0) "" ["code":protected]=> int(1) ["file":protected]=> string(17) "engine-exceptions.php" ["line":protected]=> int(1) ["trace":"BaseException":private]=> array(0) { } ["previous":"BaseException":private]=> NULL}
OneAPM for PHP 能够深入到所有 PHP 应用内部完成应用性能管理 能够深入到所有 PHP 应用内部完成应用性能管理和监控,包括代码级别性能问题的可见性、性能瓶颈的快速识别与追溯、真实用户体验监控、服务器监控和端到端的应用性能管理。
距离 PHP 7.0.0 发布只有八个月了(译者翻译时所剩时日不多),该版本很可能是 PHP 历史上性能最快的一版。虽然现在它只具备内部测试品质(目前 RC5 已可以下载) ,但 PHP 7 的确让人期待。
并且,你能帮助它变得更好。
使用 Rasmus’s 的 PHP 7 vagrant 沙盒,开始运行你的测试套件,或执行常规的质量检验。向项目报告错误,并定期重试。
使用 PHP 7 的一大障碍是确保更新所有扩展使之与新的 Zend Engine 3 兼容。
如果你使用的扩展较为小众,没有得到其维护者足够的关注??或者你使用自己的扩展??请查看 GoPHP7-ext 项目从而确保 PHP 7 发布后一切都准备妥当。
PHP 7 中的每个新功能都有一个 RFC 。你可以在 PHP.net 维基 找到他们,并在此基础上写新文档。你可以在 在线GUI 环境下 写,包括提交(如果你有 karma)或提交补丁以供审核。
PHP 7 将是伟大的!
PHP是全世界最好的语言,没有之一 :)
抓紧测试你的应用程序。帮助迁移扩展。
P.S. 你已经在使用 PHP 7 了么?你对新功能有何感受?是否有你不满意,或者不喜欢的地方?你认为你会何时升级?让我们知道你的想法!
分享你的想法,尽在 APM俱乐部!
OneAPM for PHP 能够深入到所有 PHP 应用内部完成应用性能管理 能够深入到所有 PHP 应用内部完成应用性能管理和监控,包括代码级别性能问题的可见性、性能瓶颈的快速识别与追溯、真实用户体验监控、服务器监控和端到端的应用性能管理。