Здравствуйте, уважаемые форумчане! Помогите, пожалуйста, разобраться какая практическая польза от реализации одним классом нескольких интерфейсов и множественным наследованием самих интерфейсов. Интерфейсы же не содержать реализации методов, так как тогда они могут заменить множественное наследование функционала?
Если класс реализует один или нескольких интерфейсов, это гарантирует, что он реализует все методы, описанные в этих интерфейсах, т.е. вы смело потом можете вызывать эти методы для экземпляров класса. В дополнении к механизму интерфейсов, в php 5.4 появились ещё трейты, и они содержат реализацию методов, так что ещё больше приблизились к множественному наследованию C++, но всё равно не эквивалентно, естественно. http://php.ru/manual/language.oop5.traits.html. В принципе, насколько мне известно, ни в одном производном от C++ языке нет возможности такого же множественного наследования, как там.
трейты в приниципе интересная штука, например возвращаясь к сущностям доктрины, статьи могут иметь тэги, там будет одно свойство и 4 метода, их можно красивенько вынести в трейт и читалка аннотаций даже прекрасно сработает но! когда возникнет потребность использовать тотже самый трейт, но с другой аннотацией к свойству, то это сделать уже никак не получится... а было бы интересно, если бы можно было в самом классе переопределить свойство, которое уже объявлено в трейте
смысл в том, что в сущностях описываются еще и аннотации для свойств, вот пример кода: Код (PHP): <?php namespace My\BlogBundle\Model; use Doctrine\Common\Collections\ArrayCollection; trait TagTrait { /** * @ORM\ManyToMany(targetEntity="Tag", inversedBy="articles", cascade={"persist"}) * @ORM\JoinTable(name="blog_articles_tags_relations", * joinColumns={@ORM\JoinColumn(name="article_id")}, * inverseJoinColumns={@ORM\JoinColumn(name="tag_id")} * ) * * @var TagInterface[]|ArrayCollection|null */ protected $tags; /** * @param Tag $tag * @return $this */ public function addTag(TagInterface $tag) { if (!$this->tags->contains($tag)) { $this->tags->add($tag); //$tag->increment(); } return $this; } /** * @param Tag $tag * @return $this */ public function removeTag(TagInterface $tag) { if ($this->tags->contains($tag)) { $this->tags->removeElement($tag); //$tag->decrement(); } return $this; } /** * @param TagInterface[]|ArrayCollection $tags * @return $this */ public function setTags($tags) { $this->tags = $tags; return $this; } /** * @return Tag[]|ArrayCollection */ public function getTags() { return $this->tags; } } и вот тут то protected $tags; не переопределить... например если нужно изменить имя таблицы.
Захотелось почитать исходники Doctrine... Ведь по сути аннотации - обычные комментарии. И насколько глубоко она должна закопаться в описания классов, чтоб даже в трейтах распознавать их.
https://habrahabr.ru/post/328890/ - есть статья Цитата оттуда: Код (Text): Если ли в PHP множественное наследование? Если вам зададут такой вопрос, смело отвечайте: «да». Интерфейс может наследоваться от нескольких других интерфейсов. Теперь вы видели всё: Чувак вводит в заблуждение, но его заплюсовали, поэтому захотелось обсудить с вами, кто что думает по этому поводу. --- Добавлено --- Может холиварчик будет