ホームページ  >  記事  >  バックエンド開発  >  PHP8.1の新機能の説明 イニシャライザ イニシャライザ

PHP8.1の新機能の説明 イニシャライザ イニシャライザ

藏色散人
藏色散人オリジナル
2021-11-10 15:19:242975ブラウズ

この記事は翻訳です。元のアドレス: https://stitcher.io/blog/php-81-new-in-initializers

PHP 8.1: イニシャライザ( イニシャライザの新機能)

PHP 8.1 では、一見小さな詳細が追加されていますが、多くの人々に日常的に重大な影響を与えると思います。では、この「Initializer RFC の新機能」は何についてなのでしょうか?例を見てみましょう; 私たちは皆、次のようなコードを書いたことがあるでしょう:

class MyStateMachine
{
    public function __construct(
        private ?State $state = null,
    ) {
        $this->state ??= new InitialState();
    }
}

このステート マシンの例では、初期状態がある場合とない場合の 2 つの方法でクラスを構造化したいと考えています。初期状態を指定せずにビルドする場合は、デフォルトの状態を設定する必要があります。 PHP は確かにパラメータ リストに初期値を直接設定することをサポートしていますが、プリミティブ型のみをサポートしています。たとえば、ステート マシンが内部でオブジェクトではなく文字列を使用する場合、そのコンストラクターを次のように記述できます。

class MyStateMachine
{
    public function __construct(
        private string $state = 'initial',
    ) {
    }
}

したがって、PHP 8.1 では、同じ「デフォルト値」構文も使用できます。言い換えると、新しいデフォルト パラメータを使用できます (これは「イニシャライザ」の例です):

class MyStateMachine
{
    public function __construct(
        private State $state = new InitialState(),
    ) {
    }
}

「イニシャライザ」は単なるパラメータのデフォルトではありません。RFC からの簡単な説明は次のとおりです:

この RFC は、パラメーターのデフォルト値、プロパティ パラメーター、静的変数初期化子、およびグローバル定数初期化子で新しい式を許可することを提案しています。

そのとおりです。プロパティもこのリストに含まれています。属性を使用して属性への入力を検証する単純な検証ライブラリを想像してください。おそらく、次のように配列要素を検証できるはずです:

class CreateEmailsRequest extends FormRequestData
{
    #[ValidArray(
        email: [new Required, new ValidEmail],
        name: [new Required, new ValidString],
    )]
    public array $people;
}

PHP 8.1 より前では、その評価方法により属性で new を使用することができなかったため、そのようなコードを書くことはできませんでした。でもさあ、さあ!

言及する価値のある重要な詳細をいくつか見てみましょう。

PHP 8.1 について詳しく知りたいですか? PHP 8.1 へのパスがあります。今後 10 日間、PHP 8.1 の新機能および既存の機能に関する電子メールが毎日届きます。その後は自動的に購読が解除され、スパムやフォローアップ メールは受信されなくなります。今すぐ購読してください!

#必要な場合にのみ構築します

これらの「新しい値」は、実際に必要な場合にのみ構築されます。これは、最初の例では、引数が指定されていない場合にのみ、InitialState が新しいオブジェクトを作成することを意味します。

class MyStateMachine
{
    public function __construct(
        private State $state = new InitialState(),
    ) {
    }
}
new MyStateMachine(new DraftState()); // No InitialState is created
new MyStateMachine(); // But now it is

たとえば、プロパティの場合、リフレクティブ プロパティで呼び出された場合、 newInstance のみが呼び出されます。オブジェクトが作成されます。

#クラス属性ではありません

new はクラス属性のデフォルト値として使用できないことも知っておく必要があります。この機能をサポートすると、オブジェクトのシリアル化および逆シリアル化など、多くの予期しない副作用が発生します。

class MyStateMachine
{
    private State $state = new InitialState();
}

幸いなことに、デフォルト値を許可するプロパティをホイストしました。これは、PHP がプロパティホイスティング構文を変換して、実際のプロパティではなくコンストラクター パラメーターにデフォルト値を保持するためです。

以下は翻訳版です:

class MyStateMachine
{
    private State $state;
    
    public function __construct(
        State $state = new InitialState(),
    ) {
        $this->state = $state;
    }
}

#入力制限

お察しかもしれませんが、初期化子で新しいオブジェクトを構築すると、限られた入力セットのみを渡すことができます。たとえば、変数、スプレッド演算子、匿名クラスなどは使用できません。それでも、これは非常に歓迎すべき追加です!

以上がPHP8.1の新機能の説明 イニシャライザ イニシャライザの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。