1<?php 2$_SERVER['BASE_PAGE'] = 'releases/8.0/en.php'; 3include_once __DIR__ . '/common.php'; 4 5releases\php80\common_header( 6 'PHP 8.0 は、PHP 言語のメジャーアップデートです。' . 7 'このアップデートには、たくさんの新機能や最適化が含まれています。たとえば' . 8 '名前付き引数、union 型、アトリビュート、コンストラクタでのプロパティのプロモーション、' . 9 'match 式、 nullsafe 演算子、JIT、' . 10 '型システムの改善、エラーハンドリング、一貫性の向上などです。'); 11 12?> 13<section class="php8-section php8-section_dark php8-section_header center"> 14 <div class="page-tools"> 15 <div class="change-language"> 16 <?php releases\php80\language_chooser('ja'); ?> 17 </div> 18 </div> 19 <div class="php8-section__content"> 20 <div class="php8-logo"> 21 <img src="/images/php8/logo_php8.svg" alt="php8" height="126" width="343"> 22 </div> 23 <div class="php8-title">Released!</div> 24 <div class="php8-subtitle"> 25 PHP 8.0 は、PHP 言語のメジャーアップデートです。<br class="display-none-md"> このアップデートには、たくさんの新機能や最適化が含まれています。 26 たとえば 名前付き引数、 union 型、アトリビュート、コンストラクタでのプロパティのプロモーション、match 式、nullsafe 演算子、JIT、型システムの改善、エラーハンドリング、一貫性の向上などです。 27 </div> 28 <div class="php8-button-wrapper center"> 29 <a class="php8-button php8-button_light" href="/downloads">PHP 8 にアップデートしよう!</a> 30 </div> 31 </div> 32</section> 33 34<section class="php8-section center"> 35 <div class="php8-compare"> 36 <h2 class="php8-h2" id="named-arguments"> 37 名前付き引数 38 <a class="php8-rfc" href="https://wiki.php.net/rfc/named_params">RFC</a> 39 </h2> 40 <div class="php8-compare__main"> 41 <div class="php8-compare__block example-contents"> 42 <div class="php8-compare__label">PHP 7</div> 43 <div class="php8-code phpcode"> 44 <?php highlight_php_trimmed( 45 'htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, \'UTF-8\', false);', 46 );?> 47 </div> 48 49 50 </div> 51 <div class="php8-compare__arrow"></div> 52 <div class="php8-compare__block example-contents"> 53 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 54 <div class="php8-code phpcode"> 55 <?php highlight_php_trimmed( 56 'htmlspecialchars($string, double_encode: false);', 57 );?> 58 </div> 59 </div> 60 </div> 61 <div class="php8-compare__content"> 62 <ul> 63 <li>必須の引数だけを指定し、オプションの引数はスキップしています。</li> 64 <li>引数の順番に依存せず、自己文書化(self-documented)されています。</li> 65 </ul> 66 </div> 67 </div> 68 69 <div class="php8-compare"> 70 <h2 class="php8-h2" id="attributes"> 71 アトリビュート 72 <a class="php8-rfc" href="https://wiki.php.net/rfc/attributes_v2">RFC</a> <a class="php8-rfc" href="/manual/ja/language.attributes.php">Doc</a> 73 </h2> 74 <div class="php8-compare__main"> 75 <div class="php8-compare__block example-contents"> 76 <div class="php8-compare__label">PHP 7</div> 77 <div class="php8-code phpcode"> 78 <?php highlight_php_trimmed( 79 'class PostsController 80{ 81 /** 82 * @Route("/api/posts/{id}", methods={"GET"}) 83 */ 84 public function get($id) { /* ... */ } 85}', 86 );?> 87 </div> 88 </div> 89 <div class="php8-compare__arrow"></div> 90 <div class="php8-compare__block example-contents"> 91 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 92 <div class="php8-code phpcode"> 93 <?php highlight_php_trimmed( 94 'class PostsController 95{ 96 #[Route("/api/posts/{id}", methods: ["GET"])] 97 public function get($id) { /* ... */ } 98}', 99 );?> 100 </div> 101 </div> 102 </div> 103 <div class="php8-compare__content"> 104 <p>PHPDoc のアノテーションの代わりに、PHP ネイティブの文法で構造化されたメタデータを扱えるようになりました。</p> 105 </div> 106 </div> 107 108 <div class="php8-compare"> 109 <h2 class="php8-h2" id="constructor-property-promotion"> 110 コンストラクタでの、プロパティのプロモーション 111 <a class="php8-rfc" href="https://wiki.php.net/rfc/constructor_promotion">RFC</a> <a class="php8-rfc" href="/manual/ja/language.oop5.decon.php#language.oop5.decon.constructor.promotion">Doc</a> 112 </h2> 113 <div class="php8-compare__main"> 114 <div class="php8-compare__block example-contents"> 115 <div class="php8-compare__label">PHP 7</div> 116 <div class="php8-code phpcode"> 117 <?php highlight_php_trimmed( 118 'class Point { 119 public float $x; 120 public float $y; 121 public float $z; 122 123 public function __construct( 124 float $x = 0.0, 125 float $y = 0.0, 126 float $z = 0.0 127 ) { 128 $this->x = $x; 129 $this->y = $y; 130 $this->z = $z; 131 } 132}', 133 );?> 134 </div> 135 </div> 136 <div class="php8-compare__arrow"></div> 137 <div class="php8-compare__block example-contents"> 138 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 139 <div class="php8-code phpcode"> 140 <?php highlight_php_trimmed( 141 'class Point { 142 public function __construct( 143 public float $x = 0.0, 144 public float $y = 0.0, 145 public float $z = 0.0, 146 ) {} 147}', 148 );?> 149 </div> 150 </div> 151 </div> 152 <div class="php8-compare__content"> 153 <p>ボイラープレートのコードを減らすため、コンストラクタでプロパティを定義し、初期化します。</p> 154 </div> 155 </div> 156 157 <div class="php8-compare"> 158 <h2 class="php8-h2" id="union-types"> 159 Union 型 160 <a class="php8-rfc" href="https://wiki.php.net/rfc/union_types_v2">RFC</a> <a class="php8-rfc" href="/manual/ja/language.types.declarations.php#language.types.declarations.composite.union">Doc</a> 161 </h2> 162 <div class="php8-compare__main"> 163 <div class="php8-compare__block example-contents"> 164 <div class="php8-compare__label">PHP 7</div> 165 <div class="php8-code phpcode"> 166 <?php highlight_php_trimmed( 167 'class Number { 168 /** @var int|float */ 169 private $number; 170 171 /** 172 * @param float|int $number 173 */ 174 public function __construct($number) { 175 $this->number = $number; 176 } 177} 178 179new Number(\'NaN\'); // Ok', 180 );?> 181 </div> 182 </div> 183 <div class="php8-compare__arrow"></div> 184 <div class="php8-compare__block example-contents"> 185 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 186 <div class="php8-code phpcode"> 187 <?php highlight_php_trimmed( 188 'class Number { 189 public function __construct( 190 private int|float $number 191 ) {} 192} 193 194new Number(\'NaN\'); // TypeError', 195 );?> 196 </div> 197 </div> 198 </div> 199 <div class="php8-compare__content"> 200 <p>PHPDoc のアノテーションを使って型を組み合わせる代わりに、実行時に検証が行われる union型 をネイティブで使えるようになりました。</p> 201 </div> 202 </div> 203 204 <div class="php8-compare"> 205 <h2 class="php8-h2" id="match-expression"> 206 Match 式 207 <a class="php8-rfc" href="https://wiki.php.net/rfc/match_expression_v2">RFC</a> <a class="php8-rfc" href="/manual/ja/control-structures.match.php">Doc</a> 208 </h2> 209 <div class="php8-compare__main"> 210 <div class="php8-compare__block example-contents"> 211 <div class="php8-compare__label">PHP 7</div> 212 <div class="php8-code phpcode"> 213 <?php highlight_php_trimmed( 214 'switch (8.0) { 215 case \'8.0\': 216 $result = "Oh no!"; 217 break; 218 case 8.0: 219 $result = "This is what I expected"; 220 break; 221} 222echo $result; 223//> Oh no!', 224 );?> 225 </div> 226 </div> 227 <div class="php8-compare__arrow"></div> 228 <div class="php8-compare__block example-contents"> 229 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 230 <div class="php8-code phpcode"> 231 <?php highlight_php_trimmed( 232 'echo match (8.0) { 233 \'8.0\' => "Oh no!", 234 8.0 => "This is what I expected", 235}; 236//> This is what I expected', 237 );?> 238 </div> 239 </div> 240 </div> 241 <div class="php8-compare__content"> 242 <p>match は switch 文に似ていますが、以下の機能があります:</p> 243 <ul> 244 <li>match は式なので、結果を返したり、変数に保存したりできます。</li> 245 <li>match の分岐は一行の式だけをサポートしており、break; 文は不要です。</li> 246 <li>match は、型と値について、厳密な比較を行います。</li> 247 </ul> 248 </div> 249 </div> 250 251 <div class="php8-compare"> 252 <h2 class="php8-h2" id="nullsafe-operator"> 253 Nullsafe 演算子 254 <a class="php8-rfc" href="https://wiki.php.net/rfc/nullsafe_operator">RFC</a> 255 </h2> 256 <div class="php8-compare__main"> 257 <div class="php8-compare__block example-contents"> 258 <div class="php8-compare__label">PHP 7</div> 259 <div class="php8-code phpcode"> 260 <?php highlight_php_trimmed( 261 '$country = null; 262 263if ($session !== null) { 264 $user = $session->user; 265 266 if ($user !== null) { 267 $address = $user->getAddress(); 268 269 if ($address !== null) { 270 $country = $address->country; 271 } 272 } 273}', 274 );?> 275 </div> 276 </div> 277 <div class="php8-compare__arrow"></div> 278 <div class="php8-compare__block example-contents"> 279 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 280 <div class="php8-code phpcode"> 281 <?php highlight_php_trimmed( 282 '$country = $session?->user?->getAddress()?->country;', 283 );?> 284 </div> 285 </div> 286 </div> 287 <div class="php8-compare__content"> 288 <p>null チェックの条件を追加する代わりに、nullsafe演算子 を使って呼び出しをチェインさせられるようになりました。呼び出しチェインのひとつが失敗すると、チェインの実行全体が停止し、null と評価されます。</p> 289 </div> 290 </div> 291 292 <div class="php8-compare"> 293 <h2 class="php8-h2" id="saner-string-to-number-comparisons"> 294 数値と文字列の比較 295 <a class="php8-rfc" href="https://wiki.php.net/rfc/string_to_number_comparison">RFC</a> 296 </h2> 297 <div class="php8-compare__main"> 298 <div class="php8-compare__block example-contents"> 299 <div class="php8-compare__label">PHP 7</div> 300 <div class="php8-code phpcode"> 301 <?php highlight_php_trimmed( 302 '0 == \'foobar\' // true', 303 );?> 304 </div> 305 </div> 306 <div class="php8-compare__arrow"></div> 307 <div class="php8-compare__block example-contents"> 308 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 309 <div class="php8-code phpcode"> 310 <?php highlight_php_trimmed( 311 '0 == \'foobar\' // false', 312 );?> 313 </div> 314 </div> 315 </div> 316 <div class="php8-compare__content"> 317 <p>数値形式の文字列と比較する場合は、PHP 8 は数値として比較を行います。それ以外の場合は、数値を文字列に変換し、文字列として比較を行います。</p> 318 </div> 319 </div> 320 321 <div class="php8-compare"> 322 <h2 class="php8-h2" id="consistent-type-errors-for-internal-functions"> 323 <!--Consistent type errors for internal functions--> 324 内部関数の型に関するエラーが一貫したものに 325 <a class="php8-rfc" href="https://wiki.php.net/rfc/consistent_type_errors">RFC</a> 326 </h2> 327 <div class="php8-compare__main"> 328 <div class="php8-compare__block example-contents"> 329 <div class="php8-compare__label">PHP 7</div> 330 <div class="php8-code phpcode"> 331 <?php highlight_php_trimmed( 332 'strlen([]); // Warning: strlen() expects parameter 1 to be string, array given 333 334array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0', 335 );?> 336 </div> 337 </div> 338 <div class="php8-compare__arrow"></div> 339 <div class="php8-compare__block example-contents"> 340 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 341 <div class="php8-code phpcode"> 342 <?php highlight_php_trimmed( 343 'strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given 344 345array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0', 346 );?> 347 </div> 348 </div> 349 </div> 350 <div class="php8-compare__content"> 351 <p>ほとんどの内部関数は、引数の検証に失敗すると Error 例外をスローするようになりました。</p> 352 </div> 353 </div> 354</section> 355 356<section class="php8-section php8-section_light"> 357 <h2 class="php8-h2">JIT (ジャストインタイム) コンパイル</h2> 358 <p> 359 PHP 8 は JITコンパイル のエンジンをふたつ搭載しています。 360 トレーシングJITは、もっとも有望なふたつの人工的なベンチマークで、 361 約3倍のパフォーマンスを示しました。 362 また、長期間動いている特定のあるアプリケーションでは、1.5-2倍のパフォーマンス向上が見られました。 363 典型的なアプリケーションのパフォーマンスは、PHP 7.4 と同等でした。 364 </p> 365 <h3 class="php8-h3"> 366 PHP 8 のパフォーマンスに対するJITの貢献 367 <!-- 368 Relative JIT contribution to PHP 8 performance 369 --> 370 </h3> 371 <p> 372 <img src="/images/php8/scheme.svg" width="900" alt="Just-In-Time compilation"> 373 </p> 374 375 <div class="php8-columns"> 376 <div class="php8-column"> 377 <h2 class="php8-h2 php8-h2_margin-top">型システムとエラーハンドリングの改善</h2> 378 <ul> 379 <li> 380 算術/ビット演算子のより厳密な型チェック 381 <a href="https://wiki.php.net/rfc/arithmetic_operator_type_checks">RFC</a> 382 </li> 383 <li> 384 トレイトの抽象メソッドの検証 <a href="https://wiki.php.net/rfc/abstract_trait_method_validation">RFC</a> 385 </li> 386 <li> 387 マジックメソッドのシグネチャ <a href="https://wiki.php.net/rfc/magic-methods-signature">RFC</a> 388 </li> 389 <li> 390 エンジンの警告を整理 <a href="https://wiki.php.net/rfc/engine_warnings">RFC</a> 391 </li> 392 <li> 393 互換性のないメソッドシグネチャは fatal error に。 394 <a href="https://wiki.php.net/rfc/lsp_errors">RFC</a> 395 </li> 396 <li> 397 @ 演算子は、致命的なエラーを隠さなくなりました。 398 </li> 399 <li> 400 private メソッドの継承時のシグネチャチェック <a href="https://wiki.php.net/rfc/inheritance_private_methods">RFC</a> 401 </li> 402 <li> 403 Mixed 型のサポート <a href="https://wiki.php.net/rfc/mixed_type_v2">RFC</a> 404 </li> 405 <li> 406 戻り値で static 型をサポート <a href="https://wiki.php.net/rfc/static_return_type">RFC</a> 407 </li> 408 <li> 409 内部関数に型アノテーション 410 <a href="https://externals.io/message/106522">Email thread</a> 411 </li> 412 <li> 413 一部の拡張機能が、リソースからオブジェクトに移行: 414 <a href="https://php.watch/versions/8.0/resource-CurlHandle">Curl</a>, 415 <a href="https://php.watch/versions/8.0/gdimage">Gd</a>, 416 <a href="https://php.watch/versions/8.0/sockets-sockets-addressinfo">Sockets</a>, 417 <a href="https://php.watch/versions/8.0/OpenSSL-resource">OpenSSL</a>, 418 <a href="https://php.watch/versions/8.0/xmlwriter-resource">XMLWriter</a>, 419 <a href="https://php.watch/versions/8.0/xmlwriter-resource">XML</a> 420 </li> 421 </ul> 422 </div> 423 <div class="php8-column"> 424 <h2 class="php8-h2 php8-h2_margin-top">その他文法の調整や改善</h2> 425 <ul> 426 <li> 427 引数やクロージャーのuseリストの最後にカンマがつけられるように <a href="https://wiki.php.net/rfc/trailing_comma_in_parameter_list">RFC</a> 428 <a href="https://wiki.php.net/rfc/trailing_comma_in_closure_use_list">RFC</a> 429 </li> 430 <li> 431 catch で例外のキャプチャが不要に <a href="https://wiki.php.net/rfc/non-capturing_catches">RFC</a> 432 </li> 433 <li> 434 変数の文法の調整 <a href="https://wiki.php.net/rfc/variable_syntax_tweaks">RFC</a> 435 </li> 436 <li> 437 名前空間の名前を単一のトークンとして扱う <a href="https://wiki.php.net/rfc/namespaced_names_as_token">RFC</a> 438 </li> 439 <li> 440 Throw は式になりました <a href="https://wiki.php.net/rfc/throw_expression">RFC</a> 441 </li> 442 <li> 443 オブジェクトに対して ::class が使えるように <a href="https://wiki.php.net/rfc/class_name_literal_on_object">RFC</a> 444 </li> 445 </ul> 446 447 <h2 class="php8-h2 php8-h2_margin-top">新しいクラス、インターフェイス、関数</h2> 448 <ul> 449 <li> 450 <a href="https://wiki.php.net/rfc/weak_maps">Weak Map</a> クラス 451 </li> 452 <li> 453 <a href="https://wiki.php.net/rfc/stringable">Stringable</a> インターフェイス 454 </li> 455 <li> 456 <a href="https://wiki.php.net/rfc/str_contains">str_contains()</a>, 457 <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_starts_with()</a>, 458 <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_ends_with()</a> 459 </li> 460 <li> 461 <a href="https://github.com/php/php-src/pull/4769">fdiv()</a> 462 </li> 463 <li> 464 <a href="https://wiki.php.net/rfc/get_debug_type">get_debug_type()</a> 465 </li> 466 <li> 467 <a href="https://github.com/php/php-src/pull/5427">get_resource_id()</a> 468 </li> 469 <li> 470 <a href="https://wiki.php.net/rfc/token_as_object">token_get_all()</a> をオブジェクトベースで実装 471 </li> 472 <li> 473 <a href="https://wiki.php.net/rfc/dom_living_standard_api">New DOM Traversal and Manipulation APIs</a> 474 </li> 475 </ul> 476 </div> 477 </div> 478</section> 479 480<section class="php8-section php8-section_dark php8-section_footer php8-footer"> 481 <div class="php8-section__content"> 482 <h2 class="php8-h2 center"> 483 <!-- 484 Better performance, better syntax, improved type safety. 485 --> 486 パフォーマンスの向上、より良い文法、型システムの改善 487 </h2> 488 <div class="php8-button-wrapper center"> 489 <a class="php8-button php8-button_light" href="/downloads">PHP 8 にアップデートしよう!</a> 490 </div> 491 <div class="php8-footer__content"> 492 <p> 493 PHP 8 のソースコードのダウンロードは、 494 <a href="http://www.php.net/downloads">downloads</a> のページをどうぞ。 495 Windows 用のバイナリは <a href="http://windows.php.net/download">PHP for Windows</a> のページにあります。 496 変更の一覧は <a href="http://www.php.net/ChangeLog-8.php">ChangeLog</a> にあります。 497 </p> 498 <p> 499 <a href="/manual/ja/migration80.php">移行ガイド</a> が PHP マニュアルで利用できます。 500 新機能や下位互換性のない変更の詳細については、移行ガイドを参照して下さい。 501 </p> 502 </div> 503 </div> 504</section> 505 506 507 508 509<?php site_footer(); 510