36

PHP でクラスを使用して Traits を拡張することが許可されていないのはなぜですか?

例えば:

Trait T { }

Class C use T {}
/* or */
Class C extends T {}

そのような構文に潜在的な競合はありますか? そうは思わない。

4

3 に答える 3

32

特性をいくらか拡張できます。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
于 2016-06-07T19:01:18.600 に答える
6

延長できるのはクラスのみです。特性はクラスではありません。それらはクラスで使用/含めることができますが、クラス自体ではありません。トレイトを拡張する必要があると思われる場合、それはおそらくクラス、おそらく抽象クラスであるべきであり、トレイトではありません。

于 2012-04-07T17:08:21.407 に答える