Прочтите это внимательно Trait documentation Я рекомендую попробовать каждый пример и внести свои изменения, чтобы убедиться, что вы его понимаете. Существует мой пример, надеюсь, что это помогает:
<?php
class A {
public function foo() {
echo "x";
}
}
class B extends A {}
$test = new B();
$test->foo();
// result X
Это довольно ясно, что я думаю, так что теперь позволяет использовать Черту:
<?php
class A {
public function foo() {
echo "x";
}
}
trait T {
public function foo() {
echo "y";
}
}
class B extends A {
use T;
}
$test = new B();
$test->foo();
// result y
Как вы можете видеть, метод Черты переписывает метод базового класса. А теперь позволяет создать метод Foo в классе B
<?php
class A {
public function foo() {
echo "x";
}
}
trait T {
public function foo() {
echo "y";
}
}
class B extends A {
use T;
public function foo() {
echo "z";
}
}
$test = new B();
$test->foo();
// result z
унаследованный член от базового класса переопределяется членом, вставленного с помощью Trait. Порядок приоритета состоит в том, что члены из текущего класса переопределяют методы Trait, которые, в свою очередь, переопределяют унаследованные методы.
Из руководства по php: Унаследованный элемент из базового класса переопределяется элементом, вставленным в Trait. Порядок приоритета состоит в том, что члены из текущего класса переопределяют методы Trait, которые, в свою очередь, переопределяют унаследованные методы. –
@ Debflav хорошо нет, но не как расширенные классы, так как при расширении класса дочерний класс перезаписывает методы из родительского класса (если есть). Хотя при вставке признака внутри класса метод из класса имеет приоритет над признаком. –
@AndreiP., Спасибо, я думаю, я просто не нашел этого в руководстве – drakonli