【初心者用】 PHP8.0,8.1の新機能について

PHPのバージョンを確認すると、公式ドキュメントを確認したところ、PHP8.3まで追加されています。

今回、PHP8.0,8.1の新規機能を解説します。

1. PHP 8.0の新機能

1-1. 名前付き引数

名前付き引数は、メソッドを呼び出すときに引数にどの値を渡すのかを名前で指定できる機能です。

これまで引数の順番を知らないと配列操作ができませんでしたが、json感覚に引数定義できるようになりました。

引数の多い関数で最後の引数だけをしたい場合に有用です。




<?php
array_fill(value: 50, count: 100, start_index: 0);
?>

htmlspecialchars($string, double_encode: false);

1-2. アトリビュート

アトリビュートは、クラスやメソッド、関数、プロパティに追加情報を付加できるものです。

PHPDocのアノテーションの代わりに、PHPネイティブの文法で構造化されました。

#[ はコメントになります。




class PostsController
{
#[Route("/api/posts/{id}", methods: ["GET"])]
public function get($id) { /* ... */ }
}

1-3. コンストラクタ プロパティ

コンストラクタはクラスからオブジェクトがnewによって作成される時に自動的に呼び出されるメソッドです。

プロパティはクラスのメンバ変数のことです。

プロパティ宣言して代入する作業の2回定義定義する必要なものを1回に簡潔できます。

コンストラクタでプロパティを定義し、初期化します。




class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {}
}

1-4. Union型

Union型は、複数の異なるデータ型を1つの変数に許容することができる型を表します。




class Number {
public function __construct(
private int|float $number
) {}
}

new Number('NaN'); // TypeError

1-5. Match式

Match式は、値の一致をチェックした結果に基づいて評価結果を分岐します。

switch文と似ていますが、Match式はswitchよりソースコードが短くなり、型チェックもしてくれるので、より厳密になります。




echo match (8.0) {
'8.0' => "Oh no!",
8.0 => "This is what I expected",
};
//> This is what I expected

1-6. Nullsafe演算子

Nullsafe演算子は、PHPのコードでnull値を安全に操作するための機能です。

null演算子は、nullセーフな方法でプロパティやメソッドにアクセスするために使用されます。

これにより、nullチェックを手動で行う必要がなくなり、コードの安全性と可読性が向上します。




$country = $session?->user?->getAddress()?->country;

1-7. 数値と文字列の比較

文字列と数値を比較する場合、より厳密に数値を文字列に変換してから文字列として比較するようになりました。




0 == 'foobar' // false


比較 PHP7 PHP8
0 == "0" true true
0 == "0.0" true true
42 == "42" true true
0 == "foo" true 5-3
0 == "" true 6-3
42 == "42foo" true 7-3
"0" == "0" true true
"0" == "0.0" true true
"0" == "foo" false false
"0" == "" false false
"42" == "42" true true
"42" == "42foo" false false


引用:https://hapicode.com/php/php8.html#%E6%96%87%E5%AD%97%E3%81%A8%E6%95%B0%E5%80%A4%E6%AF%94%E8%BC%83

1-8. 内部関数の型に関するエラーが一貫したもの

内部関数は、引数の型に関する警告や例外を生成することがあります。

引数の検証に失敗すると、Error例外をスローするようになりました。




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

2. PHP 8.1の新機能

2-1. ENUM型

ENUM型は、特定の一連の定数を表すために使用され、それらの定数は事前に定義された一意の値を持ちます。

ENUM型は、コードの可読性と保守性を向上させ、特定の状態やオプションを表現するために便利です。

ENUM型を定義するには、enumキーワードを使用します。




enum Status
{
case Draft;
case Published;
case Archived;
}
function acceptStatus(Status $status) {...}

2-2. 読み取り専用プロパティ

読み取り専用プロパティは、クラス内で定義されたプロパティで、そのプロパティの値が一度設定されたら変更できないプロパティを指します。

読み取り専用プロパティは、オブジェクトの状態を保護し、外部からの誤った変更を防ぐために使用されます。

読み取り専用プロパティを定義するには、プロパティの宣言の前にreadonlyを使用します。




class BlogData
{
public readonly Status $status;

public function __construct(Status $status)
{
$this->status = $status;
}
}

2-3. 第一級callble

第一級callbleは、コールバックを使った関数コールの新しい記法です。

(...)を指定して無名関数を使います。




$foo = $this->foo(...);

$fn = strlen(...);

2-4. 交差型

交差型は、複数の型を組み合わせて1つの型として表現できる型です。

交差型は、&演算子を使用して定義します。




function count_and_iterate(Iterator&Countable $value) {
foreach ($value as $val) {
echo $val;
}

count($value);
}

2-5. Never型

Never型は、特定の関数やメソッドが絶対に正常に戻らないことを示すために使用します。

例外がスローされるか、無限ループに陥るなどのプログラムが終了しない場合に使用されます。




function redirect(string $uri): never {
header('Location: ' . $uri);
exit();
}

function redirectToLoginPage(): never {
redirect('/login');
echo 'Hello'; // <- dead code detected by static analysis
}

2-6. Finalクラス定数

Finalクラスは、子クラスに上書きされないクラス定数です。

クラス定数は、クラス内で変更不可能な値を表現するために使用され、final修飾子をクラス定数に適用すると、そのクラス定数は継承できなくなります。




class Foo
{
final public const XX = "foo";
}

class Bar extends Foo
{
public const XX = "bar"; // Fatal error
}

2-7. 8進数表記

8進数は、数値を8進数で表現するための方法を指します。

8進数を0oをつけて示します。




0o16 === 16; // false — not confusing with explicit notation
0o16 === 14; // true

2-8. Fiber

Fiberは、同時実行を実現する軽量な機能です。

Fiberは非同期コードよりも直感的に書くことができ、I/O操作や非同期タスクの処理を高効率で実行できるため、Webアプリケーションやサーバサイドの処理に役立ちます。




$response = $httpClient->request('https://example.com/');
print json_decode($response->getBody()->buffer())['code'];

2-9. 文字列キー配列のアンパック

アンパックとは、連想配列のキーと値を取り出して、それらを個々の変数に代入する操作です。



$arrayA = ['a' => 1];
$arrayB = ['b' => 2];

$result = ['a' => 0, ...$arrayA, ...$arrayB];

// ['a' => 1, 'b' => 2]

3. まとめ

PHPのバージョン8.0、8.1を解説しました。使える機能がいっぱいあるので、お試しで使ってみてはいかがでしょうか。

個人的には7.4以降から使えない機能など結構変わっていると実感しました。

改めて、PHPの学習を進めていきたいと思います。