Как раз сегодня когда разбирался с поведениями в YII2 столкнулся с трейтами... я так понял что трейты это что то типа наследования.. вот такой вот пример я нарисовал.. PHP: <?php class Math { public function quickCalc() { $sum = 5 + 5; return $sum; } } trait fixMath { public function quickCalc() { $sum = parent::quickCalc(); return $sum + 10; } } class myMath extends Math { use fixMath; } $sum = new myMath(); echo $sum->quickCalc(); приблизительно как работает я понял)) а вот зачем это?? почему нельзя сделать вот так вот.. зачем трейты?)) PHP: <?php class Math { public function quickCalc() { $sum = 5 + 5; return $sum; } } class myMath extends Math { public function quickCalc() { $sum = 5 + 5; $sum = $sum + 10; return $sum; } } $sum = new myMath(); echo $sum->quickCalc();
не забывайте про правила приоритетности внутренних свойств при наследовании, трейте, интерфейсе. вопрос: сколько трейтов можно заюзать?)
ну я так понимаю сначала у нас идет интерфейс.. потом его свойства перекрывает наследования.. а потом трейты.. а трейтов сколько угодно можно добавлять.. а вот как там приоритетность не знаю) хотя интересно как ведет себя класс если он выступает как наследуемый, а в нем есть трейты..
Почему во всех языках, производных от C++, отказались от множественного наследования? Потому что люди им неправильно пользовались. Как один замечательный лектор говорил: у крышки стола есть площадь, у пола есть площадь, поэтому люди наследовали крышку стола от пола, и как бы забывали о том, что теперь на стол можно паркет стелить Трейты в php эту проблему решают. Пол и крышка стола - совсем разные объекты, они не могут быть в одной иерархии. Но код подсчёта площади дублировать всё же не хочется. Поэтому мы можем сделать PHP: trait HasArea { public $width, $len; // Ну понятно, приваты лучше, но лень сеттеры рисовать public function getArea() { return $this->width * $this->len; } } class TableDesk { use HasArea; // Куча методов про цвет скатерти и т.п. } class Floor { use HasArea; // А здесь методы про то, покрыт ли пол линолеумом или паркетом } --- Добавлено --- В реале ещё можно было TableDesk от кого-нибудь унаследовать, мне просто так сразу не придумать, от кого.
да)) уже проверил) PHP: <?php class Math { public function quickCalc() { $sum = 5 + 5; return $sum; } } trait fixMath { public function quickCalc() { $sum = parent::quickCalc(); return $sum + 10; } } class myMath extends Math { use fixMath; } class myMath2 extends myMath { } $sum = new myMath2(); echo $sum->quickCalc(); и трейты наследуются.. --- Добавлено --- блин.... это гениально)) --- Добавлено --- получается есть класс описывающий стол и пол... а мы выносим в отдельный трейт то что в этих классах одинаковое.. подсчет площади... а подсчет площади много где еще может использоваться (стены, потолок) там тоже трейт подключать этот можно.. удобно..