こんにちは。よっしーです(^^)
今日は、PHPのTraits(トレイト)についてご紹介します。
背景
PHP8.2を利用したAPIを開発しているときに Traits を利用したので、そのときの調査内容を備忘としてのこしました。
こちらのサイトを参考にしています。
静的変数、静的メソッド、および静的プロパティ
トレイトは、静的変数、静的メソッド、および静的プロパティを定義できます。
注意:
PHP 8.1.0以降、トレイト上で静的メソッドを呼び出したり、静的プロパティに直接アクセスすることは非推奨です。静的メソッドおよびプロパティは、トレイトを使用するクラスでのみアクセスすべきです。
以下はいくつかの例です。
例 #9: 静的変数
trait Counter {
public function inc() {
static $c = 0;
$c = $c + 1;
echo "$c\n";
}
}
class C1 {
use Counter;
}
class C2 {
use Counter;
}
$o = new C1(); $o->inc(); // echo 1
$p = new C2(); $p->inc(); // echo 1
例 #10: 静的メソッド
trait StaticExample {
public static function doSomething() {
return 'Doing something';
}
}
class Example {
use StaticExample;
}
Example::doSomething();
例 #11: 静的プロパティ
trait StaticExample {
public static $static = 'foo';
}
class Example {
use StaticExample;
}
echo Example::$static;
これらの例では、トレイト内で静的変数、静的メソッド、および静的プロパティが定義されています。それぞれのクラスでトレイトを使用し、静的メソッドやプロパティをアクセスしています。静的メソッドやプロパティは、クラスに対してトレイトを使用することでアクセスできます。
補足
PHP 8.1.0以降、トレイト上で静的メソッドや静的プロパティに直接アクセスすることが非推奨となった理由は、トレイト自体がクラスに対する再利用可能なコードのセットであり、トレイトが単体で動作するものではないからです。トレイトは、クラス内でコードを再利用するためのものであり、そのコードはクラス内で動作する文脈に依存します。
この非推奨ポリシーの背後にある主な理由は、コードの整合性と予測可能性を維持することです。トレイトがクラス内でのみ使用されるようにすることにより、コードの振る舞いがより予測可能になり、バグや予期しない動作のリスクが低減します。また、トレイトがクラスの一部として考えられるため、コードのメンテナンスやデバッグが容易になります。
したがって、トレイトの静的メソッドやプロパティを使用する際には、必ずクラス内で使用するようにすることが推奨されます。これにより、コードの信頼性と可読性が向上し、将来のバージョンでの非互換性や問題を回避できます。
おわりに
今日は、PHPのTraits(トレイト)についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント