これは、待望の PHP 7 に関する記事シリーズの最初の記事です。
おそらく、PHP 5.0.0 タイムラインで言及した RFC (Request For Comments) が通過し、PHP 7 が PHP の次のメジャー バージョンの名前になったことはすでにご存知かと思います。
このトピックについてどう思うかは関係なく、PHP 7 は重要なものであり、それは今年登場します。 PHP 7.0 タイムライン RFC がほぼ満場一致 (32 対 2) で可決された後、すべての機能が確立され、6 月中旬に最初のリリース候補 (RC) がリリースされる予定です。
しかし、これはあなたにとって何を意味しますか?新しい 5.x バージョンがリリースされた後、多くの Web ホストがアップグレードに消極的であることがわかります。メジャーな新しいバージョンがリリースされると、下位互換性の大きなギャップが生じ、アップグレードが遅くなるのではありませんか?
答えは次のとおりです。それは状況によります。ぜひ読んでください。
新しいバージョンでは、多くの言語のエッジケースが処理されています。さらに、パフォーマンスと不一致の修正もこのバージョンの焦点です。
次のステップは、詳細について話し合うことです。
残念ながら、針/干し草の山の問題はまだ修正されていません。ただし、待望の内部およびユーザーレベルの一貫性をもたらす 2 つの重要な RFC が採用されました。
最大の (そして最も目に見えない) 変更は、コンパイル中のコードの中間表現である抽象構文ツリー (AST) の追加です。この表現を使用すると、エッジケースの不一致をいくつか解消し、AST を使用してよりパフォーマンスの高い OpCode を生成するなど、将来の気の利いたツールの開発に備えることができます。
第二に、統一変数構文の導入により、さらに多くの問題が発生する可能性があります。これにより、式の評価における多くの非互換性が解決されます。たとえば、($object->closureProperty)() を使用して、プロパティに割り当てられたクロージャ関数を呼び出すことができます。また、次のような静的呼び出しをチェーンすることもできます。
class foo { static $bar = 'baz'; } class baz { static $bat = 'Hello World'; } baz::$bat = function () { echo "Hello World"; }; $foo = 'foo'; ($foo::$bar::$bat)();
ただし、一部の構文は変化。特に、変数->変数/プロパティ構文を使用します。
PHP 7 より前では、$obj->$properties['name'] は、名前が "$properties" 配列の name キーに属するプロパティにアクセスしていました。ユニバーサル変数構文を使用して、名前が「$properties」に属するプロパティの名前キーにアクセスします。
より簡潔に言うと、PHP 5.6 で
$obj->$properties['name']
という構文を使用すると、PHP 7 では
$obj->{$properties['name']}
として解析されます。
{$obj->$properties}['name']
変数->変数は通常、境界の場合に使用されます。私の経験によれば、変数->プロパティの方が一般的に使用されますが、使用するのは簡単ではありません。ただし、(上記の例のように) 中括弧を使用すると、PHP 5.6 および 7 で同じ効果を簡単に確保できます。
PHP 7 にアップグレードする最大の理由はパフォーマンスの向上です。このパフォーマンスの向上は主に phpng に導入された変更によるものです。実際、パフォーマンスの向上により、特に一般にアップグレードに消極的な小規模ホストの場合、同じマシンでより多くの顧客をホストできるようにするためにアップグレードする可能性が高くなります。
これまでのところ、さまざまなベンチマークによると、PHP 7 のパフォーマンスは Facebook の HHVM と同等です。HHVM は、可能な限り PHP コードを機械語命令にコンパイルする Just In Time コンパイラーを備えています。
PHP 7 には JIT がありませんが、それについては多くの議論があります。 JIT を追加することでどの程度パフォーマンスが向上するかは不明ですが、JIT を作成することに興味がある人は興味深いでしょう。
パフォーマンスの向上に加えて、内部データ構造の最適化が常にパフォーマンスの向上を達成する主な方法であるため、大量のメモリも節約する必要があります。
内部開発者は下位互換性 (BC) を損なわないよう最善を尽くしていますが、言語を進化させたい場合は、常に互換性を考慮することはできません。
ただし、統一変数構文による下位互換性の破壊と同様、これらの非互換性は、非オブジェクトでメソッドを呼び出そうとしたときにキャッチできる致命的なエラーなど、ほとんどの場合は軽微です:
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"; // 依旧会运行
さらに、ASP タグと script タグが削除されました。これは、<% および <%=、または ) を意味します。 ;)。
その他の大きな変更点は、「すべての非推奨関数の削除」を参照してください。
最も重要な非互換性の変更には、POSIX 準拠の正規表現拡張機能、EXT/ereg (バージョン 5.3 で非推奨) および古い EXT/mysql 拡張機能 (バージョン 5.5 で非推奨) が削除されました。
もう 1 つの小さな非互換性変更は、スイッチで複数のデフォルトのケースを許可しないことです。 PHP 7 より前では、次のものが許可されていました:
switch ($expr) { default: echo "Hello World"; break; default: echo "Goodbye Moon!"; break; }
これにより、後者のみが実行されます。 PHP 7 では、次のようになります:
Fatal error: Switch statements may only contain one default clause - Switch 语法只允许包含一个默认子句
在面对向后不兼容带来的影响时,我们颇有微词。性能上的提升又让我们欢欣鼓舞。但是,最让我们醉心的是新的特性!新特性才是让每次发布充满乐趣的关键—— PHP 7 可不缺乏新特性。
我会最先介绍 PHP 7 添加的最具争议的变化:标量类型提示。这一特性的添加一开始并未通过投票。接着该作者撤回了该 RFC。之后,许多执行之后相互抵触的 RFC 被提了出来,经过一番公开的讨论,原先的这个 RFC 还是通过了。
对于你,最终用户,而言,这意味着你可以对标量类型进行类型提示( type-hint )。具体地说,标量类型包括:int,float,string,和 bool 。默认情况下,类型提示不是严格的,这意味着他们将迫使原始类型转化为类型提示指定的类型。这意味着,如果你将 int(1) 传入需要 float 类型的函数,它会变为 float(1)。将 float(1.5) 传入需要 int 类型的函数,它会变为 int(1)。
这里的一个例子:
function sendHttpStatus(int $statusCode, string $message) { header('HTTP/1.0 ' .$statusCode. ' ' .$message); } sendHttpStatus(404, "File Not Found"); // 传了整形和字符串 sendHttpStatus("403", "OK"); // 字符串 "403" 强转为 int(403)
此外,将声明 declare(strict_types=1); 放在任意文档的顶部,可以启用严格模式,文档中的任何函数调用都必须遵从指定的类型。Strict 与否取决于函数调用的文件,而非函数定义的文件。
如果一个类型提示不匹配,一个可捕获的致命错误会被抛出:
<?php declare(strict_types=1); // 必须放置在第一行 sendHttpStatus(404, "File Not Found"); // 传了整型和字符串 sendHttpStatus("403", "OK"); // Catchable fatal error: 传给 sendHttpStatus() 的第一个参数类型必须是整形,目前提供的是字符串
此外,PHP 7 还支持 返回类型提示,它支持所有相同的类型作参数。这遵循与 hack 相同的语法,在括号后面插入冒号,然后是类型:
function isValidStatusCode(int $statusCode): bool { return isset($this->statuses[$statusCode]); }
在这个例子中:bool 表明该函数将返回一个布尔值。
返回类型提示的严格模式遵从与类型提示相同的法则。
我个人最喜欢的 PHP 7 新增特性是 综合比较运算符,<=>,也称为飞船操作符。此处我可能是带个人喜好的,因为是我写的最初补丁,也影响了命名(T_SPACESHIP)。但这仍是对 PHP 语言的一个好补充,与大于和小于操作符形成互补。
实际上,该操作符的工作方式与 strcmp(),或 version_compare() 基本一致。如果左侧操作数小于右侧,则返回 -1 , 两边相等则返回 0 ,如果左侧大于右侧则返回 1 。主要的区别在于,它可以用在任何两个操作数间,不仅是字符串,还可以是整数,浮点数,数组等等。
该操作符最常见的用法是在排序回调中:
// 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; }
OneAPM for PHP 能够深入到所有 PHP 应用内部完成应用性能管理 能够深入到所有 PHP 应用内部完成应用性能管理和监控,包括代码级别性能问题的可见性、性能瓶颈的快速识别与追溯、真实用户体验监控、服务器监控和端到端的应用性能管理。
在本文中,我们了解了 PHP 7 中最重要的不兼容性修复,已经两大新特性。
在接下来的第二篇文章中,我们将介绍 PHP 7 中重要的其他六个功能。另外,我们将在文章系列的最后介绍一些帮助 PHP 7 发展的方法。
原文链接:https://blog.engineyard.com/2015/what-to-expect-php-7