下述代码展示了 PHP 中类的继承、trait 的使用以及如何在 trait 方法中调用父类(基类)的方法。具体如下:

  1. 定义一个基类 Base:
class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

这个基类 Base 定义了一个公共方法 sayHello(),它简单地输出 "Hello "。

  1. 定义一个 trait SayWorld:
trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

这里创建了一个 trait 叫做 SayWorld,它也包含一个方法 sayHello()。在 SayWorldsayHello() 方法内部,使用了 parent::sayHello(); 这行代码。这里的 parent:: 是 PHP 中用来调用父类(基类)方法的关键字。这行代码的意思是调用当前类(在这个上下文中是使用了此 trait 的类)父类的 sayHello() 方法。这样做的目的是在执行当前 trait 中的方法之前,先执行基类中同名方法的逻辑。

  1. 定义一个继承自 Base 类并使用 SayWorld trait 的类 MyHelloWorld:
class MyHelloWorld extends Base {
    use SayWorld;
}
  • 1.
  • 2.
  • 3.

MyHelloWorld 继承自 Base 类,并使用了 SayWorld trait。由于 trait 中的方法覆盖了基类中的同名方法,但又在其内部通过 parent::sayHello(); 调用了基类方法,实现了功能的扩展而不是完全替代。

  1. 实例化 MyHelloWorld 并调用 sayHello() 方法:
$o = new MyHelloWorld();
$o->sayHello();
  • 1.
  • 2.

创建 MyHelloWorld 类的实例 $o,并调用其 sayHello() 方法。因为 MyHelloWorld 类通过 use SayWorld; 使用了 SayWorld trait,所以实际上调用的是 trait 中定义的 sayHello() 方法。这个方法首先通过 parent::sayHello(); 调用了基类 BasesayHello() 输出 "Hello ",然后继续输出 “World!”,最终输出结果为 “Hello World!”。