18

PHP マニュアルの例 #2 http://php.net/manual/en/language.oop5.traits.php状態

<?php
class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}

class MyHelloWorld extends Base {
    use SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello();
?>

これは正しいコードですがparent::、そのコンテキストで使用するのは安全ではありません。他のクラスを継承しない独自の「hello world」クラスを作成したとします。

<?php
class MyOwnHelloWorld
{
    use SayWorld;
}
?>

sayHello()メソッドを呼び出すまで、このコードはエラーを生成しません。これは悪いです。

一方、トレイトが特定のメソッドを使用する必要がある場合は、このメソッドを abstract として記述できます。これにより、コンパイル時にトレイトが正しく使用されることが保証されるため、これは優れています。ただし、これは親クラスには適用されません。

<?php
trait SayWorld
{
    public function sayHelloWorld()
    {
        $this->sayHello();
        echo 'World!';
    }

    public abstract function sayHello(); // compile-time safety

}

だから私の質問は:特定の特性を使用するクラスがメソッドを持つことを(実行時ではなくコンパイル時に)確実にする方法はありparent::sayHello()ますか?

4

4 に答える 4

4

いいえ、ありません。実際、この例は非常に悪いです。なぜなら、トレイトを導入する目的は、継承に依存せずに多くのクラスに同じ機能を導入することであり、使用parentするにはクラスに親が必要なだけでなく、特定のメソッドも必要だからです。

ちなみに、parent呼び出しはコンパイル時にチェックされません。メソッドの親呼び出しで何も拡張しない単純なクラスを定義できます。これらのメソッドのいずれかが呼び出されるまで機能します。

于 2012-10-21T22:14:18.903 に答える