概要
PHP 7 は 2015/12/3 に正式リリースされました。これは、プログラマーと開発者に非常に興味深い体験を提供します。実際、PHP 7 は新しい機能を導入し、いくつかの機能を変更および改善してパフォーマンスを向上させ、リソース管理を最も効率的にします。ご存知のように、現在最も安定した PHP バージョンは PHP 5.6 ですが、最新のリリースは PHP 7 です。なぜですか?なぜ PHP 6 ではないのでしょうか?実際、開発者たちはこの問題について多くの議論を繰り広げてきました。過去には PHP 6 というバージョンが存在しましたが、開発者やリリース担当者の期待に応えられるものではありませんでした。PHP 6 には多くのバグがあり、テストバージョンとしてのみ存在していました。そして、ユーザーが PHP 6 のテストバージョンと混同しないように、開発者たちは今回 PHP 7 を正式バージョンとして命名しました。
パフォーマンス
PHP 7 の最大のブレークスルーは、アプリケーションのパフォーマンスを驚くほど向上させたことです。これは、Zend エンジンを採用した結果です。Zend エンジンは、データ構造をコンパクトにし、データを分割し、メモリを最も合理的に解放するエンジンです。その結果、PHP 7 を使用するアプリケーションのパフォーマンスは 2 倍になり、メモリ使用量は半分になります。以下のグラフは、PHP 7 が PHP 5.6 と HHVM 3.7 と比べてパフォーマンスとリソース使用量においていかに優れているかを示しています。
見ることができるように、最近の安定バージョンである PHP 5.6 と比較すると、PHP 7 はほとんどのアプリケーション (Magento 1.9、Drupal 7、8、WordPress 2.6、4.1 など) において、単位時間あたりのリクエスト処理速度が優れています。さらに、他の言語とコンテキストのレンダリング速度を比較すると、PHP 7 は Ruby 2.1、Python 2.7.8、Perl 5.18.4 よりもはるかに優れています。
PHP 7 の新機能
新しい演算子: Spaceship と Null Coalescing
Spaceship 演算子
正式名称は Combined Comparison Operator (結合比較演算子) です。記号は <=> です。この演算子は、両方のオペランドが等しい場合は 0 を、左側のオペランドが大きい場合は 1 を、右側のオペランドが大きい場合は -1 を返します。これは三元比較演算子とも呼ばれ、Perl や Ruby などの他の一般的なプログラミング言語にも存在します。この演算子の一般化は以下の通りです。
Null Coalescing 演算子
Null Coalescing 演算子は、2 つの疑問符 (??) で表されます。これは、何かが存在するかどうかを確認し、存在しない場合はデフォルト値を返すために使用できます。Coalesce 演算子は、最初のオペランドが存在し null でない場合はその結果を返し、そうでない場合は 2 番目のオペランドを返します。以下の例は、この演算子が基本的な宣言で時間を短縮する方法を示しています。
$name = $_GET['name'] ?? 'John Doe';
// $name は $_GET['name'] が存在し null でない場合はその値になり、// 存在しないまたは null の場合は 'John Doe' になります。
さらに、null 合体演算子を使用して複数の条件を組み合わせることができます。
null 合体演算子 (??) は、左側の式が null または undefined の場合に右側の式を評価し、それ以外の場合は左側の式を返します。
$age = $_GET['age'] ?? 18;
// $age は $_GET['age'] が存在し null でない場合はその値になり、// 存在しないまたは null の場合は 18 になります。
型宣言の精度向上
非厳格型宣言には、coercive (デフォルト) と strict の 2 つの宣言方法があります。PHP 7 では、プログラマーが返り値の型を定義することで、コードの品質を向上させることができます。利用可能な関数を完全に理解していない場合、PHP は関数の返り値の型を宣言する機能を提供します。PHP 7 は、非厳格型 int、float、string、bool に対する 4 つの新しい宣言方法を導入しました。これらの非厳格型により、プログラマーは int、float、string、bool 型の値を返すことができます。さらに、PHP 7 では、プログラマーがパラメーター型の値を返すこともできます。
function sum(int $a, int $b): int {
return $a + $b;
}
$result = sum(1, 2); // $result は int 型になります
厳格な型を使用するには、プログラマーはファイルの先頭に declare() を宣言する必要があります。これは、この宣言がそのファイルでのみ構成に影響を与えることを意味します。この宣言は、パラメータの種類だけでなく、関数の戻り値の種類にも影響します。これは再帰と同様の意味を持ちます。このデータ型を宣言すると、型チェックでエラーが発生した場合、対応する例外が送出されます。
declare(strict_types=1);
function add(int $x, int $y): int {
return $x + $y;
}
$result = add(1, 2.5);
// Fatal error: Uncaught TypeError: Argument 2 passed to add()
// must be of the type int, float given
チェックタイプが完了した時点で、コマンドが実行されます。これは、厳格な型が呼び出される関数/メソッドにのみ適用されることを意味します。再帰型の例は次のとおりです。
declare(strict_types=1);
function factorial(int $n): int {
if ($n === 0) {
return 1;
}
return $n * factorial($n - 1);
}
echo factorial(5); // 120
匿名クラス補足
匿名クラスは、名前のないクラスです。
匿名クラスは、次の場合に使用できます:
- クラスがデータ格納に使用されない場合
- クラスが実行中に1回だけ使用される場合
匿名クラスは、名前のないクラスであり、名前付きクラスと機能的に同じです。匿名クラスは、次の構文を使用して作成されます。
$object = new class {
public function sayHello() {
echo "Hello, world!";
}
};
$object->sayHello(); // Hello, world!
Closure の call() メソッド
call() メソッドは、クロージャを呼び出す際の省略形として使用されます。これは、クロージャを参照するオブジェクトのスコープを取得する際に使用されます。これにより、コードがより簡潔になり、呼び出す前に中間要素を作成する必要がなくなります。
// Closure:匿名関数
$closure = function () {
// "Hello, world!"を出力
echo "Hello, world!";
};
// 通常の呼び出し
// Closure を直接呼び出す
$closure(); // Hello, world!
// call() メソッドの使用
// $this をスコープとして Closure を呼び出す
$closure->call($this); // Hello, world!
// call() メソッドと引数
// $this と "John Doe" を引数として Closure を呼び出す
$closure->call($this, "John Doe"); // Hello, John Doe!
その他にも、いくつかの機能があります。
- unserialize() のフィルタリング
- エラーと例外のより簡単な管理
- use を使用した名前空間の宣言
これらの機能については、パート 2 で詳しく説明します。
記事を読んでいただきありがとうございます。
まだ改善点があると思いますので、ご意見ご感想をお寄せください。