PHP でクラスを使用して Traits を拡張することが許可されていないのはなぜですか?
例えば:
Trait T { }
Class C use T {}
/* or */
Class C extends T {}
そのような構文に潜在的な競合はありますか? そうは思わない。
特性をいくらか拡張できます。mrleeの答えを拡張するとuse
、特性のときにそのメソッドの名前を変更できます。
たとえば、フレームワークによって定義された「親」特性があるとします。
trait FrameworkTrait {
public function keepMe() {
// Framework's logic that you want to keep
}
public function replaceMe() {
// Framework's logic that you need to overwrite
}
}
親の特性を取得し、そのreplaceMe
メソッドの名前を別のものに変更し、独自のreplaceMe
メソッドを定義するだけです。
trait MyTrait {
use FrameworkTrait {
FrameworkTrait::replaceMe as frameworkReplaceMe;
}
public function replaceMe() {
// You can even call the "parent" method if you'd like:
$this->frameworkReplaceMe();
// Your logic here
}
}
そして、あなたのクラスで:
class MyClass {
use MyTrait;
}
このクラスのオブジェクトはこれを行うことができます:
$obj = new MyClass();
$obj->keepMe(); // calls "parent" trait
$obj->replaceMe(); // calls "child" trait
$obj->frameworkReplaceMe(); // calls "parent" trait
延長できるのはクラスのみです。特性はクラスではありません。それらはクラスで使用/含めることができますが、クラス自体ではありません。トレイトを拡張する必要があると思われる場合、それはおそらくクラス、おそらく抽象クラスであるべきであり、トレイトではありません。