За последние 24 часа нас посетили 22788 программистов и 1278 роботов. Сейчас ищут 656 программистов ...

Трейты на примерах

Тема в разделе "PHP для новичков", создана пользователем Алекс8, 22 июн 2017.

  1. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    Как раз сегодня когда разбирался с поведениями в YII2 столкнулся с трейтами...
    я так понял что трейты это что то типа наследования..

    вот такой вот пример я нарисовал..
    PHP:
    1. <?php
    2. class Math {
    3.     public function quickCalc() {
    4.         $sum = 5 + 5;
    5.         return $sum;
    6.     }
    7. }
    8.  
    9. trait fixMath {
    10.     public function quickCalc() {
    11.         $sum = parent::quickCalc();
    12.         return $sum + 10;
    13.     }
    14. }
    15.  
    16. class myMath extends Math {
    17.     use fixMath;
    18. }
    19.  
    20. $sum = new myMath();
    21. echo $sum->quickCalc();
    приблизительно как работает я понял)) а вот зачем это?? почему нельзя сделать вот так вот..
    зачем трейты?))
    PHP:
    1. <?php
    2. class Math {
    3.     public function quickCalc() {
    4.         $sum = 5 + 5;
    5.         return $sum;
    6.     }
    7. }
    8.  
    9. class myMath extends Math {
    10.     public function quickCalc() {
    11.         $sum = 5 + 5;
    12.         $sum = $sum + 10;  
    13.         return $sum;
    14.     }
    15. }
    16.  
    17. $sum = new myMath();
    18. echo $sum->quickCalc();
     
  2. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Для обхода ограничения связанного с отсутствием множественного наследования в php
     
  3. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    то есть
    Код (Text):
    1. class myMath extends Math
    равноценно
    Код (Text):
    1. class myMath  {
    2.   use Math;
     
  4. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    не забывайте про правила приоритетности внутренних свойств при наследовании, трейте, интерфейсе. вопрос: сколько трейтов можно заюзать?)
     
  5. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    ну я так понимаю сначала у нас идет интерфейс.. потом его свойства перекрывает наследования.. а потом трейты.. а трейтов сколько угодно можно добавлять.. а вот как там приоритетность не знаю)

    хотя интересно как ведет себя класс если он выступает как наследуемый, а в нем есть трейты..
     
  6. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    вот проверьте, это любят спрашивать :)
     
    Алекс8 нравится это.
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Почему во всех языках, производных от C++, отказались от множественного наследования? Потому что люди им неправильно пользовались. Как один замечательный лектор говорил: у крышки стола есть площадь, у пола есть площадь, поэтому люди наследовали крышку стола от пола, и как бы забывали о том, что теперь на стол можно паркет стелить :) Трейты в php эту проблему решают. Пол и крышка стола - совсем разные объекты, они не могут быть в одной иерархии. Но код подсчёта площади дублировать всё же не хочется. Поэтому мы можем сделать
    PHP:
    1. trait HasArea {
    2.    public $width, $len; // Ну понятно, приваты лучше, но лень сеттеры рисовать
    3.  
    4.    public function getArea()
    5.    {
    6.          return $this->width * $this->len;
    7.    }
    8. }
    9.  
    10. class TableDesk {
    11.     use HasArea;
    12.    // Куча методов про цвет скатерти и т.п.
    13. }
    14.  
    15. class Floor {
    16.     use HasArea;
    17.     // А здесь методы про то, покрыт ли пол линолеумом или паркетом
    18. }
    --- Добавлено ---
    В реале ещё можно было TableDesk от кого-нибудь унаследовать, мне просто так сразу не придумать, от кого.
     
    #7 mkramer, 22 июн 2017
    Последнее редактирование: 22 июн 2017
    artoodetoo и Алекс8 нравится это.
  8. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    да)) уже проверил)
    PHP:
    1. <?php
    2.  
    3. class Math {
    4.     public function quickCalc() {
    5.         $sum = 5 + 5;
    6.         return $sum;
    7.     }
    8. }
    9.  
    10. trait fixMath {
    11.     public function quickCalc() {
    12.         $sum = parent::quickCalc();
    13.         return $sum + 10;
    14.     }
    15. }
    16.  
    17. class myMath extends Math {
    18.     use fixMath;
    19. }
    20.  
    21. class myMath2 extends myMath {
    22.    
    23. }
    24.  
    25. $sum = new myMath2();
    26. echo $sum->quickCalc();
    и трейты наследуются..
    --- Добавлено ---
    блин.... это гениально))
    --- Добавлено ---
    получается есть класс описывающий стол и пол...
    а мы выносим в отдельный трейт то что в этих классах одинаковое.. подсчет площади...
    а подсчет площади много где еще может использоваться (стены, потолок) там тоже трейт подключать этот можно..
    удобно..