Мой руководитель группы СОЛК однажды описал это как Горизонтальное наследование с помощью этой простой аналогии,
У всех птиц есть перья, но не все птицы умеют летать.
В этой аналогии бегство – это черта характера. Все птицы наследуют свойство иметь перья, но только некоторые из них действительно могут летать
Согласно Горизонтальное повторное использование для PHP RFC
Черты – это механизм повторного использования кода в языках с одним наследованием, таких как PHP. Черта предназначена для уменьшения некоторых ограничений одиночного наследования, позволяя разработчику свободно использовать наборы методов в нескольких независимых классах, живущих в разных иерархиях классов.
На английском языке черты просто позволяют повторно использовать методы, если есть необходимость поделиться функциональностью между несколькими классами, вы используете черты. Используя черты, методы могут свободно использоваться повторно в нескольких различных независимых классах, независимо от их иерархии классов.
Черты похожи на миксины в других языках, таких как Ruby и JS.
Пример использования Черт
Точно так же, как аналогия наверху. У нас есть классы Parrot и Ostrich, которые оба наследуются от класса Bird. И класс Попугай, и Страус имеют перья, унаследованные от класса Птица, но только попугай может летать, потому что у него есть черта Полета.
class Bird
{
private $type;
public function __construct(string $type)
{
$this->type = $type;
}
public function feathers(): string
{
return "I am a " . $this->type . " and i have feathers";
}
}
trait Flight
{
public function fly(): string
{
return " - I can fly too";
}
}
class Parrot extends Bird
{
use Flight;
public function __construct()
{
parent::__construct('Parrot');
}
}
class Ostrich extends Bird
{
public function __construct()
{
parent::__construct('Ostrich');
}
}
$skiTheOstrich = new Ostrich(); echo $skiTheOstrich->feathers(); //returns: I am a Ostrich and i have feathers $johnTheParrot = new Parrot(); echo $johnTheParrot->feathers(); echo $johnTheParrot->fly(); //returns: I am a Parrot and i have feathers - I can fly too
Преимущества черт характера
- Позволяет повторно использовать код
- Неограниченный иерархиями наследования
- Класс может иметь несколько признаков
Недостатки черт характера
- Поощряет раздутые классы
- Просто “скопируйте и вставьте” код между классами.
- Костыль для ленивого программирования
- Способности целого класса визуально НЕ находятся в одном месте.
ВЕРДИКТ???
Лично мне черты характера не нравятся, почему? ты спрашиваешь. Я сторонник традиционных принципов разработки программного обеспечения, и эта черта допускает множественное наследование, и я лично поддерживаю Композиция над наследованием . Для меня многие черты в коде являются признаком запаха кода.
Используя черты, трудно следовать коду, потому что в нем есть такая функциональность, где вы не знаете, как класс ее реализует а потом вы замечаете “использовать XYZ” где-то наверху а ты такой, ха-ха!
Я также считаю, что это немного странно проверять. Поэтому по этим причинам, хотя я считаю, что у них есть свои собственные варианты использования!!!
я ненавижу
Когда я подписываю, я говорю:
Мое мнение является моим собственным на сегодняшний день ( может измениться завтра ), а не мнением моего работодателя ( или моим к завтрашнему дню ).
У тебя противоположное мнение или ты хочешь дать мне пять, ты можешь @Trussdamola
Оригинал: “https://dev.to/trussdamola/hateitorloveit-traits-dpd”