来自 PHP 手册的示例 #2,http://php.net/manual/zh/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需要使用某个方法我可以将该方法编写为抽象方法,这是好的,因为它确保Trait在编译时正确使用。但是这并不适用于父类:
<?php
trait SayWorld
{
public function sayHelloWorld()
{
$this->sayHello();
echo 'World!';
}
public abstract function sayHello(); // compile-time safety
}
我想问的是:是否有一种方法能够确保(在编译时而不是运行时)使用某个特征的类将拥有parent::sayHello()
方法?