PHP 8新特性シリーズ:コンストラクタ属性向上使用及び注意事項
3204 ワード
この記事では、主にPHP 8コンストラクタのプロパティのアップグレードの使用方法について説明します.このプロパティは、コンストラクタでクラスプロパティを設定または初期化する必要がある場合に便利です(
PHP 8ではコンストラクション関数メソッドに直接クラスの属性を定義するように簡略化できる
ただし、コンストラクタのプロパティはコンストラクタメソッドでのみ定義できます(くだらない話のようです).また、親クラスでコンストラクタのプロパティが定義されていない限り、コンストラクタのプロパティを追加する必要があります.たとえば、
実際の使用中には、いくつかの詳細に注意する必要があります.
抽象クラスまたはインタフェースのコンストラクタメソッドでは、コンストラクタプロパティ定義は使用できません.
しかしTraitsでは使用が許可されています
オブジェクトタイプのコンストラクタアトリビュートは、
コンストラクタのプロパティのタイプがオブジェクトである場合は、
ただし、
コンストラクタのプロパティは使用できません
コンストラクタのプロパティ定義も可変パラメータは使用できません
コンストラクタのプロパティとクラスのプロパティは繰り返し定義できません
たとえば
コンストラクタプロパティを使用して、まだ定義されていない追加のクラスプロパティを定義できます.
単純なデフォルトしか使用できません
たとえば、パラメータのデフォルト値で関数やオブジェクトをインスタンス化することはできません.
もっと多くの使い方は自分で研究することができます.
public
、protected
、private
、public
).例えば、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(),
) {}
もっと多くの使い方は自分で研究することができます.