Одна из основных задач, которую решают трейты, - это реализация множественного наследования в 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 предупреждения?