示例#2 来自 PHP 手册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()
在我调用该方法之前,此代码不会产生任何错误。这是不好的。
另一方面,如果 trait 需要使用某种方法,我可以将此方法编写为 abstract,这很好,因为它可以确保在编译时正确使用 trait。但这不适用于父类:
<?php
trait SayWorld
{
public function sayHelloWorld()
{
$this->sayHello();
echo 'World!';
}
public abstract function sayHello(); // compile-time safety
}
所以我的问题是:有没有办法确保(在编译时,而不是在运行时)使用某种特征的类将具有parent::sayHello()
方法?