maxpoitn2point
@maxpoitn2point
Как всегда, в своем репертуаре

В чем практическая польза от такого подхода?

Изучая фреймворк возник вопрос:
В чем польза и какое практическое применение такого подхода, а именно зачем создавать интерфейсы для сушностей.
например
<?php
namespace Acme\BlogBundle\Model;
Interface PageInterface
{
    /**
     * Set title
     *
     * @param string $title
     * @return PageInterface
     */
    public function setTitle($title);
    /**
     * Get title
     *
     * @return string 
     */
    public function getTitle();
    /**
     * Set body
     *
     * @param string $body
     * @return PageInterface
     */
    public function setBody($body);
    /**
     * Get body
     *
     * @return string 
     */
    public function getBody();
}

<?php
namespace Acme\BlogBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Acme\BlogBundle\Model\PageInterface;
/**
 * Page
 *
 * @ORM\Table()
 * @ORM\Entity()
 */
class Page implements PageInterface
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @var string
     * @ORM\Column(name="title", type="string", length=255, nullable=false)
     */
    private $title;
    /**
     * @var string
     *
     * @ORM\Column(name="body", type="text")
     */
    private $body;
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set title
     *
     * @param string $title
     * @return Page
     */
    public function setTitle($title)
    {
        $this->title = $title;
    
        return $this;
    }
    /**
     * Get title
     *
     * @return string 
     */
    public function getTitle()
    {
        return $this->title;
    }
    /**
     * Set body
     *
     * @param string $body
     * @return Page
     */
    public function setBody($body)
    {
        $this->body = $body;
    
        return $this;
    }
    /**
     * Get body
     *
     * @return string 
     */
    public function getBody()
    {
        return $this->body;
    }
}

В чем соль? Обязательно делать так?
  • Вопрос задан
  • 350 просмотров
Решения вопроса 4
DevMan
@DevMan
https://ru.wikipedia.org/wiki/Интерфейс_(объектно-...
хотя написано относительно других яп, но многое справедливо и по отношению к php.

php.net/manual/ru/language.oop5.interfaces.php
Ответ написан
Комментировать
dmitriylanets
@dmitriylanets
веб-разработчик
у тебя будет функционал который будет использовать объект данного класса, например
function renderPage(PageInterface $Page){
....
}

таким образом ты говоришь что объект Page должен реализовывать интерфейс PageInterface и в соответственно его методы будут востребованы в работе renderPage. Это увеличит понятность кода, и стабильность в работе.
Ответ написан
Комментировать
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
Как и сказал diamond - для унификации кода.
У вас может быть много разных типов страниц. Например, новостные, ленты видеороликов, ещё что-нибудь. Все они чем-то друг от друга отличаются. Но для общей функциональности можно использовать один код (DRY) - пагинация, комментарии, ещё что-нибудь. Интерфейс даёт вам и вашему коду уверенность благодаря ранее (при реализации интерфейса) заключённому соглашению, что класс, например, реализует нужные методы.
Либо же, например, вы можете осуществлять с помощью интерфейсов какие-то другие вещи. Например, вам нужно что-то сделать, когда в Doctrine происходит Flush определённой группы объектов. Вычленить их из общей массы можно в том числе с помощью интерфейса.
Ответ написан
Комментировать
@heartdevil
плыву как воздушный шарик
Привет.

У вас сущность может содержать все что угодно и это никак не проконтролировать. Так вот чтобы она хоть каким-то нормам строго следовала, нужно заставить эту сущность реализовать интерфейс (соблюсти контракт). После этого сущности уже некуда будет деться и она вынуждена будет следовать вашему контракту. Ну а далее, в любом необходимом месте, просто предъявляете сущности контракт и работаете строго по интерфейсу.

Другое объяснение -- это призма через которую вы смотрите на сущность и видите только то, что позволяет видеть призма.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы