1. Home
  2. PHP
  3. PHP 8.2 の新機能を試してみよう

PHP 8.2 の新機能を試してみよう

  • 公開日
  • カテゴリ:PHP
  • タグ:PHP
PHP 8.2 の新機能を試してみよう

PHP: PHP 8.2.0 Release Announcement - php.net

PHP 8.2 が 2022 年 12 月 8 日に正式リリースされています。PHP 8.2 の新しい機能を使ってみようと思います。

Contents

  1. 読み取り専用クラス
  2. DNF(Disjunctive Normal Form)型
  3. null, false, true が独立した型に
  4. トレイトで定数
  5. 動的なプロパティが非推奨に
  6. 文字列への ${} 形式での値の埋め込み
  7. Stack trace

読み取り専用クラス

読み取り専用クラス - php.net

クラスに対して readonly を指定できる。

  • 宣言している全てのプロパティに対して readonly を指定したことになる
  • 動的なプロパティの作成を禁止したことになる
  • 以下のプロパティには readonly を指定できないため、そのプロパティを持つクラスは readonly にできない
    • 型を指定していないプロパティ
    • static プロパティ
  • readonly を指定したクラスは子クラスでも readonly を指定した場合にのみ継承できる
  • 以下のクラスは readonly にできない
    • 列挙型
    • trait
    • interface
// PHP 8.2 以前
class Book
{
    public function __construct(
        private readonly string $title,
        private readonly Author $author,
    )
    {
    }
}

// ↓ ↓ ↓

// PHP 8.2
readonly class Book
{
    public function __construct(
        private string $title,
        private Author $author,
    )
    {
    }
}
// readonly を指定できないプロパティを持つクラスは readonly にできない
readonly class Author
{
    public function __construct(
        private $name,
    )
    {
    }
}

// -> Fatal error: Readonly property Author::$name must have type
// readonly を指定したクラスは子クラスでも readonly を指定した場合にのみ継承できる

class MyBook extends Book
{

}

// -> Fatal error: Non-readonly class MyBook cannot extend readonly class Book

DNF(Disjunctive Normal Form)型

PHP RFC: Disjunctive Normal Form Types - php.net

交差型と union 型が組み合わせて使えるようになった。

  • 組み合わせるときは交差型は括弧で囲む必要がある

DNFDisjunctive Normal Form の略称で、「選言標準形」のこと。

選言標準形(せんげんひょうじゅんけい、英: Disjunctive normal form, DNF)は、数理論理学においてブール論理での論理式の標準化(正規化)の一種であり、連言節(AND)の選言(OR)の形式で論理式を表す。加法標準形、主加法標準形、積和標準形とも呼ぶ。正規形としては、自動定理証明で利用されている。

選言標準形 - wikipedia
interface aaa {}

class A implements aaa{}

class B {
    public function __construct(
        // DNF 型
        public (A&aaa)|null $name,
    )
    {
    }
}

null, false, true が独立した型に

null, false, true が、独立した型になった。

class User {}

interface UserFinder
{
    function findUserByEmail(): User|null;
}

class AlwaysNullUserFinder implements UserFinder
{
    function findUserByEmail(): null
    {
        return null;
    }
}

トレイトで定数

トレイトで定数が定義できるようになった

  • トレイトを使うクラスを通じて定数にアクセスできる
trait A
{
    const FOO = 1;
}

class B
{
    use A;
}

B::FOO;
// -> 1

A::FOO;
// -> Fatal error: Uncaught Error: Cannot access trait constant A::FOO

動的なプロパティが非推奨に

動的にプロパティを生成することは非推奨となった

class Book
{
    public string $author;
}

$book = new Book();

$book->author = 'author'; // ok

$book->title = 'book';
// -> Deprecated: Creation of dynamic property Book::$title is deprecated

クラスにアトリビュート #[\AllowDynamicProperties] を付与すると動的なプロパティ生成が許可される

#[\AllowDynamicProperties]
class A
{
}

$a = new A();

$a->name = 'name'; // ok

stdClass ではまだ動的なプロパティ生成で警告は出ない

$user = new stdClass();
$user->name = 'name'; // ok

文字列への ${} 形式での値の埋め込み

${} 形式の文字列への値の埋め込みが非推奨になった。

$name = 'name';

$a = "$name test"; // ok

$a = "{$name} test"; // ok

$a = "${$name} test";
// -> Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead

$a = "{${$name}} test"; // ok

Stack trace

Stack trace の出力において、機密性の高いパラメータの出力を抑制できるようになった。

before: これまでは Stack trace にパラメータが出力されてしまっていた

class A
{
    public function __construct(
        private string $hoge,
        private string $fuga,
    )
    {
        throw new Exception();
    }
}

$a = new A('hoge', 'fuga');
// -> Stack trace: ... A->__construct('hoge', 'fuga')

after: #[SensitiveParameter] アトリビュートを付与することで、Stack trace に出力されなくなる

class B
{
    public function __construct(
        private string $hoge,
        #[SensitiveParameter] private string $fuga,
    )
    {
        throw new Exception();
    }
}

$b = new B('hoge', 'fuga');
// -> Stack trace: ... B->__construct('hoge', Object(SensitiveParameterValue))

まとめ

PHP 8.2 では型まわりや記法の改善や強化が多い印象でした。パフォーマンスも地道に改善が行われているようなので積極的に最新バージョンを使っていきたいですね。

Author

rito

  • Backend Engineer
  • Tokyo, Japan
  • PHP 5 技術者認定上級試験 認定者
  • 統計検定 3 級