PHP特性:是否有一种正确的方法来确保使用特征的类扩展包含某种方法的超类?

Mac*_* Sz 18 php inheritance class traits superclass

实施例#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();
?>
Run Code Online (Sandbox Code Playgroud)

这是正确的代码,但parent::在该上下文中使用是不安全的.假设我写了自己的'hello world'类,它不继承任何其他类:

<?php
class MyOwnHelloWorld
{
    use SayWorld;
}
?>
Run Code Online (Sandbox Code Playgroud)

在调用sayHello()方法之前,此代码不会产生任何错误.这是不好的.

另一方面,如果特征需要使用某种方法,我可以将此方法编写为抽象,这很好,因为它确保在编译时正确使用特征.但这不适用于父类:

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

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

}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:有没有办法确保(在编译时,而不是在运行时)使用某个特征的类将有parent::sayHello()方法?

dev*_*ler 4

不,那里没有。事实上,这个例子很糟糕,因为引入特征的目的是向许多类引入相同的功能而不依赖继承,而使用parent不仅要求类有父类,而且还应该有特定的方法。

附带说明一下,在parent编译时不会检查调用,您可以定义简单的类,该类不会在其方法中使用父调用扩展任何内容,直到调用其中一个方法为止,它将一直工作。