よっしー
こんにちは。よっしーです(^^)
今日は、PHPのTraits(トレイト)についてご紹介します。
背景
PHP8.2を利用したAPIを開発しているときに Traits を利用したので、そのときの調査内容を備忘としてのこしました。
こちらのサイトを参考にしています。
プロパティ
トレイトはプロパティも定義できます。
例 #12 プロパティの定義
trait PropertiesTrait {
public $x = 1;
}
class PropertiesExample {
use PropertiesTrait;
}
$example = new PropertiesExample;
$example->x;
トレイトがプロパティを定義している場合、クラスは同じ名前のプロパティを定義できません。ただし、プロパティが互換性がある場合(同じ可視性、型、readonly 修飾子、および初期値)、それ以外の場合は致命的なエラーが発生します。
例 #13 衝突の解決
trait PropertiesTrait {
public $same = true;
public $different1 = false;
public bool $different2;
public bool $different3;
}
class PropertiesExample {
use PropertiesTrait;
public $same = true;
public $different1 = true; // 致命的なエラー
public string $different2; // 致命的なエラー
readonly protected bool $different3; // 致命的なエラー
}
このように、トレイトで定義されたプロパティとクラスでのプロパティが競合する場合、プロパティの互換性を確保する必要があります。互換性がない場合、エラーが発生します。
定数
PHP 8.2.0以降、トレイトも定数を定義できます。
例 #14 定数の定義
trait ConstantsTrait {
public const FLAG_MUTABLE = 1;
final public const FLAG_IMMUTABLE = 5;
}
class ConstantsExample {
use ConstantsTrait;
}
$example = new ConstantsExample;
echo $example::FLAG_MUTABLE; // 1
トレイトが定数を定義している場合、クラスは同じ名前の定数を定義できません。ただし、定数が互換性がある場合(同じ可視性、初期値、および最終性)、それ以外の場合は致命的なエラーが発生します。
例 #15 衝突の解決
trait ConstantsTrait {
public const FLAG_MUTABLE = 1;
final public const FLAG_IMMUTABLE = 5;
}
class ConstantsExample {
use ConstantsTrait;
public const FLAG_IMMUTABLE = 5; // 致命的なエラー
}
このように、トレイトで定義された定数とクラスでの定数が競合する場合、定数の互換性を確保する必要があります。互換性がない場合、エラーが発生します。
おわりに
今日は、PHPのTraits(トレイト)についてご紹介しました。
よっしー
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント