PHP 8.0.0 正式リリース JITの実装により高速化
2020年11月29日
PHPの最新版「8.0.0」が正式リリースされました。
PHP 8.0 is a major update of the PHP language.
https://www.php.net/releases/8.0/en.php
It contains many new features and optimizations including named arguments, union types, attributes, constructor property promotion, match expression, nullsafe operator, JIT, and improvements in the type system, error handling, and consistency.
JITによりPHP7に比べ高速化されている
PHP8.0.0は実行時のコンパイラJIT(Just In Time)の導入により、以前のバージョンに比べ実行速度が高速化された様です。
PHP 8 の新機能
その他PHP8の新機能は以下の内容が発表されています。
- Union型2.0
- 名前付き引数
- match式
- アトリビュート
- コンストラクタプロパティプロモーション
- Null安全演算子
- Weak Maps
以下オフィシャルで掲載されているコード例です。
1 2 3 4 5 | // PHP7 htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false); // PHP8 htmlspecialchars($string, double_encode: false); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // PHP7 class PostsController { /** * @Route("/api/posts/{id}", methods={"GET"}) */ public function get($id) { /* ... */ } } // PHP8 class PostsController { #[Route("/api/posts/{id}", methods: ["GET"])] public function get($id) { /* ... */ } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | // PHP7 class Point { public float $x; public float $y; public float $z; public function __construct( float $x = 0.0, float $y = 0.0, float $z = 0.0, ) { $this->x = $x; $this->y = $y; $this->z = $z; } } // PHP8 class Point { public function __construct( public float $x = 0.0, public float $y = 0.0, public float $z = 0.0, ) {} } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // PHP7 class Number { /** @var int|float */ private $number; /** * @param float|int $number */ public function __construct($number) { $this->number = $number; } } new Number('NaN'); // Ok // PHP8 class Number { public function __construct( private int|float $number ) {} } new Number('NaN'); // TypeError |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // PHP7 switch (8.0) { case '8.0': $result = "Oh no!"; break; case 8.0: $result = "This is what I expected"; break; } echo $result; //> Oh no! // PHP8 echo match (8.0) { '8.0' => "Oh no!", 8.0 => "This is what I expected", }; //> This is what I expected |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // PHP7 $country = null; if ($session !== null) { $user = $session->user; if ($user !== null) { $address = $user->getAddress(); if ($address !== null) { $country = $address->country; } } } // PHP8 $country = $session?->user?->getAddress()?->country; |
1 2 3 4 5 | // PHP7 0 == 'foobar' // true // PHP8 0 == 'foobar' // false |
1 2 3 4 5 6 7 8 9 10 | // PHP7 strlen([]); // Warning: strlen() expects parameter 1 to be string, array given array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0 // PHP8 strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0 |
プログラムによっては修正が必要
PHP5系からPHP7系への移行もプログラムの修正が必要でしたが、PHP8系への移行もサンプルを見る限り修正が必要になりそうです。
S.E->お勧め記事;
S.E->関連記事;