PHP trait:有没有一种正确的方法来确保使用ttraits的类扩展了包含某种方法的超类?
2022-08-30 22:25:51
PHP 手动 http://php.net/manual/en/language.oop5.traits.php 状态的示例 #2
<?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();
?>
这是正确的代码,但在该上下文中使用是不安全的。假设我写了我自己的“hello world”类,它不继承任何其他类:parent::
<?php
class MyOwnHelloWorld
{
use SayWorld;
}
?>
在我调用该方法之前,此代码不会产生任何错误。这很糟糕。sayHello()
另一方面,如果特征需要使用某种方法,我可以将此方法编写为抽象方法,这很好,因为它可以确保在编译时正确使用该特征。但这不适用于父类:
<?php
trait SayWorld
{
public function sayHelloWorld()
{
$this->sayHello();
echo 'World!';
}
public abstract function sayHello(); // compile-time safety
}
所以我的问题是:有没有办法确保(在编译时,而不是在运行时)使用某种特征的类将有方法?parent::sayHello()