@eugene159

Как вызвать метод трейта из метода класса с таким же названием, чтобы не было Deprecated предупреждения?

Одна из основных задач, которую решают трейты, - это реализация множественного наследования в PHP.

В наследовании - нормально в дочернем классе переопределить метод родительского класса, чтобы он работал также, как родительский, но с небольшим изменением. Обычно в методе дочернего класса дописывается код, а потом вызывается родительский метод через parent::method(). И никаких предупреждений нет.

Вот пример:
class MyClass extends MyClassParent {
    public function sharedMethod() {
        echo "Method from MyClass\n";
        parent::sharedMethod();
    }
}

class MyClassParent {
    public function sharedMethod() {
        echo "Method from MyClassParent\n";
    }
}

$myclass = new MyClass();
$myclass->sharedMethod();

Вот, что он выводит:
Method from MyClass
Method from MyClassParent

Никаких предупреждений нет. Но если вместо (или вместе) наследования использовать трейт:
trait MyTrait {
    public function sharedMethod() {
        echo "Method from trait\n";
    }
}

class MyClass extends MyClassParent {

    use MyTrait;

    public function sharedMethod() {
        echo "Method from MyClass\n";
        MyTrait::sharedMethod();
        parent::sharedMethod();
    }
}

То будет предупреждение о том, что я пытаюсь через два двоеточия :: вызвать нестатический метод трейта sharedMethod:
Deprecated: Non-static method MyTrait::sharedMethod() should not be called statically in ...

Как правильно вызвать метод трейта из метода класса с таким же названием, чтобы не было Deprecated предупреждения?
  • Вопрос задан
  • 135 просмотров
Пригласить эксперта
Ответы на вопрос 1
Назначьте алиас на метод трейта:
use MyTrait {
    sharedMethod as traitSharedMethod;
}


И вызывайте уже его:
$this->traitSharedMethod();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы