PHP 8新特性シリーズ:コンストラクタ属性向上使用及び注意事項

3204 ワード

この記事では、主にPHP 8コンストラクタのプロパティのアップグレードの使用方法について説明します.このプロパティは、コンストラクタでクラスプロパティを設定または初期化する必要がある場合に便利です(publicprotectedprivatepublic).例えば、PHP 7でクラスの属性をこのように定義し、コンストラクタで値を伝えることができます.
class Point {
    public int $x;
    private string $y;

    public function __construct(int $x = 0, string $y='') {
        $this->x = $x;
        $this->y = $y;
    }
} 

PHP 8ではコンストラクション関数メソッドに直接クラスの属性を定義するように簡略化できる
class Point {
    public function __construct(public int $x = 0, private string $y = '') {
        //               x y    (      x y    )
        var_dump($this->x); 
        var_dump($this->y); 
    }
} 

ただし、コンストラクタのプロパティはコンストラクタメソッドでのみ定義できます(くだらない話のようです).また、親クラスでコンストラクタのプロパティが定義されていない限り、コンストラクタのプロパティを追加する必要があります.たとえば、
class Test {
    public function __construct(
        public int $x = 0
    ) {}
}

class Child extends Test {
    public function __construct(
        $x, 
        public int $y = 0,
        public int $z = 0,
    ) {
        parent::__construct($x);
    }
} 

実際の使用中には、いくつかの詳細に注意する必要があります.
抽象クラスまたはインタフェースのコンストラクタメソッドでは、コンストラクタプロパティ定義は使用できません.
abstract class Test {
    //   
    abstract public function __construct(private $x);
}
 
interface Test {
    //   
    public function __construct(private $x);
} 

しかしTraitsでは使用が許可されています
trait MyTrait
{
    public function __construct(
        public string $a,
    ) {}
} 

オブジェクトタイプのコンストラクタアトリビュートは、protectedをデフォルト値として使用できません.
コンストラクタのプロパティのタイプがオブジェクトである場合は、privateをパラメータのデフォルト値として使用できません.
class Test {
    //   
    public function __construct(public Type $prop = null) {}
} 

ただし、
class Test {
    //   
    public function __construct(public ?Type $prop = null) {}
} 
nullタイプのコンストラクタ属性定義はサポートされていません
class Test {
    //   
    public function __construct(public callable $callback) {}
} 

コンストラクタのプロパティは使用できませんnull定義
class Test {
    //   
    public function __construct(var $prop) {}
} 

コンストラクタのプロパティ定義も可変パラメータは使用できません
class Test {
    // Error: Variadic parameter.
    public function __construct(public string ...$strings) {}
} 

コンストラクタのプロパティとクラスのプロパティは繰り返し定義できません
たとえば
class Test {
    public string $prop;
    public int $explicitProp;

    // Error: Redeclaration of property.
    public function __construct(public string $prop) {}
} 

コンストラクタプロパティを使用して、まだ定義されていない追加のクラスプロパティを定義できます.
class Test {
    public string $prop;
    public int $explicitProp;

    // Correct
    public function __construct(public int $promotedProp, int $arg) {
        $this->explicitProp = $arg;
    }
} 

単純なデフォルトしか使用できません
たとえば、パラメータのデフォルト値で関数やオブジェクトをインスタンス化することはできません.
public function __construct(
    public string $name = 'Brent',
    //   
    public DateTime $date = new DateTime(),
) {} 

もっと多くの使い方は自分で研究することができます.