За последние 24 часа нас посетили 18118 программистов и 2082 робота. Сейчас ищут 1093 программиста ...

Множественное наследование и интерфейсы

Тема в разделе "PHP для новичков", создана пользователем m8051, 27 сен 2013.

  1. m8051

    m8051 Новичок

    С нами с:
    18 июн 2013
    Сообщения:
    6
    Симпатии:
    0
    Здравствуйте, уважаемые форумчане! Помогите, пожалуйста, разобраться какая практическая польза от реализации одним классом нескольких интерфейсов и множественным наследованием самих интерфейсов. Интерфейсы же не содержать реализации методов, так как тогда они могут заменить множественное наследование функционала?
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.594
    Симпатии:
    1.764
    Если класс реализует один или нескольких интерфейсов, это гарантирует, что он реализует все методы, описанные в этих интерфейсах, т.е. вы смело потом можете вызывать эти методы для экземпляров класса. В дополнении к механизму интерфейсов, в php 5.4 появились ещё трейты, и они содержат реализацию методов, так что ещё больше приблизились к множественному наследованию C++, но всё равно не эквивалентно, естественно. http://php.ru/manual/language.oop5.traits.html. В принципе, насколько мне известно, ни в одном производном от C++ языке нет возможности такого же множественного наследования, как там.
     
  3. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    трейты рулят
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.594
    Симпатии:
    1.764
    Вы их уже пользуете на реальных сайтах?
     
  5. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я - да. только не по уму, а просто как удобный способ совать всякое одинаковое в разные места.
     
  6. d1gi

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

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    трейты в приниципе интересная штука, например возвращаясь к сущностям доктрины, статьи могут иметь тэги, там будет одно свойство и 4 метода, их можно красивенько вынести в трейт и читалка аннотаций даже прекрасно сработает ;) но! когда возникнет потребность использовать тотже самый трейт, но с другой аннотацией к свойству, то это сделать уже никак не получится... а было бы интересно, если бы можно было в самом классе переопределить свойство, которое уже объявлено в трейте ;)
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    смысл в трейте-то какой тогда? о_О Просто напиши свойство в классе и не юзай трейт.
     
  8. d1gi

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

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    смысл в том, что в сущностях описываются еще и аннотации для свойств, вот пример кода:

    Код (PHP):
    1. <?php
    2.  
    3. namespace My\BlogBundle\Model;
    4.  
    5. use Doctrine\Common\Collections\ArrayCollection;
    6.  
    7. trait TagTrait
    8. {
    9.     /**
    10.      * @ORM\ManyToMany(targetEntity="Tag", inversedBy="articles", cascade={"persist"})
    11.      * @ORM\JoinTable(name="blog_articles_tags_relations",
    12.      *      joinColumns={@ORM\JoinColumn(name="article_id")},
    13.      *      inverseJoinColumns={@ORM\JoinColumn(name="tag_id")}
    14.      * )
    15.      *
    16.      * @var TagInterface[]|ArrayCollection|null
    17.      */
    18.     protected $tags;
    19.  
    20.     /**
    21.      * @param Tag $tag
    22.      * @return $this
    23.      */
    24.     public function addTag(TagInterface $tag)
    25.     {
    26.         if (!$this->tags->contains($tag)) {
    27.             $this->tags->add($tag);
    28.             //$tag->increment();
    29.         }
    30.  
    31.         return $this;
    32.     }
    33.  
    34.     /**
    35.      * @param Tag $tag
    36.      * @return $this
    37.      */
    38.     public function removeTag(TagInterface $tag)
    39.     {
    40.         if ($this->tags->contains($tag)) {
    41.             $this->tags->removeElement($tag);
    42.             //$tag->decrement();
    43.         }
    44.  
    45.         return $this;
    46.     }
    47.  
    48.     /**
    49.      * @param TagInterface[]|ArrayCollection $tags
    50.      * @return $this
    51.      */
    52.     public function setTags($tags)
    53.     {
    54.         $this->tags = $tags;
    55.  
    56.         return $this;
    57.     }
    58.  
    59.     /**
    60.      * @return Tag[]|ArrayCollection
    61.      */
    62.     public function getTags()
    63.     {
    64.         return $this->tags;
    65.     }
    66. }
    и вот тут то protected $tags; не переопределить... например если нужно изменить имя таблицы.
     
  9. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.594
    Симпатии:
    1.764
    Захотелось почитать исходники Doctrine... Ведь по сути аннотации - обычные комментарии. И насколько глубоко она должна закопаться в описания классов, чтоб даже в трейтах распознавать их.
     
  11. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    https://habrahabr.ru/post/328890/ - есть статья
    Цитата оттуда:
    Код (Text):
    1. Если ли в PHP множественное наследование?
    2.  
    3. Если вам зададут такой вопрос, смело отвечайте: «да». Интерфейс может наследоваться от нескольких других интерфейсов.
    4.  
    5. Теперь вы видели всё:

    Чувак вводит в заблуждение, но его заплюсовали, поэтому захотелось обсудить с вами, кто что думает по этому поводу.
    --- Добавлено ---
    Может холиварчик будет:D
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    а методы, добавленные через трейт, участвуют в проверке соответствия класса интерфейсу?