最新のバージョンであるPHP8.1が2021年11月25日にリリースされました。
サポートもとっくに切れてるPHP5.6をいまだに使ってるので新しいバージョンを使うのはいつになるかと
思っていますがさて最新ではどんなものが追加されたかとみてました。
https://www.php.net/releases/8.1/en.php
1 2 3 4 5 6 |
enum Status { case Draft; case Published; case Archived; } |
Enum?このバージョンまでなかったのか..なくてもまあめちゃめちゃ困るということはなかったが
確かにリンク先のようにしたりdefineで定義してたり列挙型っぽくしてたのであるといいか。
ReadOnlyのアクセス修飾子
一度だけ初期化可能でそのあとは変更不可
https://php.watch/versions/8.1/readonly
上記に記載されているが
これが
1 2 3 4 5 6 7 |
class User { public readonly int $uid; public function __construct(int $uid) { $this->uid = $uid; } } |
こう書ける
1 2 3 |
class User { public function __construct(public readonly int $uid) {} } |
実際に以下のようにすると6行目でエラーになっちゃう
1 2 3 4 5 6 |
class User { public function __construct(public readonly int $uid) {} } $user = new User(42); $user->uid = 16; |
ちなみに初期化はクラス内であればどこでも可
さっきはコンストラクタだったが初期化用の関数からでも以下のように
1 2 3 4 5 6 7 8 9 10 |
class User { public readonly int $uid; public function fetch(int $uid) { $this->uid = $uid; } } $user = new User(); $user->fetch(42); |
当然このあと$user->fetch(16);と呼ぶとエラーに。
クラスのスコープ外だとそれはできないと
1 2 3 4 5 |
class User { public readonly int $uid; } $user = new User(); $user->uid = 9; |
あとreadonlyプロパティはunset呼べない。
1 2 3 |
class User { public readonly $uid; } |
Readonly property User::$uid must have type..
Readonlyは型をつけないとエラー、8.0で追加されたmixed型が使えるとのこと
Readonlyなんだけど以下のようなパターンの場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class User { public string $username; } class Post { public readonly User $author; public function __construct(User $author) { $this->author = $author; } } $user = new User(); $user->username = 'Foo'; $post = new Post($user); $user->username = 'Bar'; |
Postクラスで$authorがreadonly。だけどそのあと’Bar’で更新できちゃう。
16行目の後echo $post->author->username;で呼び出すと確かにBarになってますね。
readonly自体はよく使いそうな感じだがこれはちゃんと知ってないとやらかすことがでてきそう。
不変性を求めるなら8行目の個所を
1 |
$this->author = clone $author; |
とすると先ほどの’Bar’と表示されていたところは変わらずFooと出力される。
あとreadonlyは予約キーワードになるので旧バージョンでreadonlyの名前を使っていた場合8.1に上げる際は修正が必要。
まだまだあるけど今回はここまで。