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()
ますか?