xref: /web-php/releases/8.0/ja.php (revision c093fb53)
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