Пример # 2 из руководства PHP http://php.net/manual/en/language.oop5.traits.php states
<?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()
. Это плохо.
С другой стороны, если черта должна использовать определенный метод , я могу написать этот метод как абстрактный, и это хорошо, так как это гарантирует правильность использования признака во время компиляции. Но это не относится к родительским классам:
<?php
trait SayWorld
{
public function sayHelloWorld()
{
$this->sayHello();
echo 'World!';
}
public abstract function sayHello(); // compile-time safety
}
Итак, мой вопрос: есть ли способ гарантировать (во время компиляции, а не во время выполнения), что класс, который использует определенный признак, будет иметь метод parent::sayHello()
?