Ответы пользователя по тегу Полиморфизм
  • Чем отличаются эти две статьи (полиморфизм, PHP)?

    код в статьях не отличается ничем.
    за каким чертом автор №2 решил выпендриться, и объяснить "Что такое полиморфизм на самом деле" с использованием абсолютно такого же примера - останется тайной на века.
    лично меня ни один толком не убедил.

    попробую привести собственный пример:
    <?php 
    
    // базовый класс публикации
    // имеет свойства для заголовка и тела
    // умеет отдавать контент в простейшем виде
    class Publication {
      protected $_header;
      protected $_body;
      
      public function __construct($header, $body) {
        $this->_header = $header;
        $this->_body = $body;
      }
    
      public function getContent() {
        return 
          '<h1>' . $this->_header .  '</h1>' . 
          '<p>' . $this->body . '</p>';
      }
    }
    
    // статья в дополнение имеет еще свойство для имени автора
    // конструктор переопределен для задания имени автора
    // метод getContent переопределен, чтобы дописывать под заголовком статьи имя автора
    class Article extends Publication {
      protected $_author;
      
      public function __construct($header, $body, $author) {
        parent::__construct($header, $body);
        
        $this->_author = $author;
      }
    
      public function getContent() {
        return 
          '<h1>' . $this->_header .  '</h1>' . 
          '<br /><br/ >'. 
          'By ' . $this->author . 
          '<br /><br/ >'. 
          '<p>' . $this->body . '</p>';
      }
    }
    
    // объявление переопределяет только метод getContent 
    // заворачивает вывод в блок определенного класса - так объявление заметнее
    // но сам контент генерируется родительским методом
    class Announcement extends Publication {
      public function getContent() {
        return 
          '<div class="announcement">' . 
            parent::getContent() . 
          '</div>';
      }
    }
    
    // а вот короткая новость, например, не переопределяет метод getContent
    // он ей подходит как есть
    // она только с данными немного шаманит
    class ShortNews extends Publication {
      public function __construct($header, $body) {
        $this->_body = substr($header, 0, 31);
        $this->_body = substr($body, 0, 255);
      }
    }
    
    // а вот и принтер
    // принтер печатает публикации
    // ему пофиг, какие именно - хоть короткую новость мы его попросим напечатать, хоть объявление
    // он знает, что у любой публикации есть метод getContent, результат которого можно напечатать
    // потому что объекты классов статья/объявление/короткая новость - они одновременно и объекты класса публикация
    // это и есть полиморфизм
    class PublicationPrinter {
      public static function print(Publication $publication) {
        print($publication->getContent());
      }
    }
    Ответ написан
    Комментировать