Задать вопрос

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

То ли я туплю=) Вообще не въеду, есть две статьи на хабре про полиморфизм. 1-я статья habrahabr.ru/post/37576 2-я статья habrahabr.ru/post/37610 Во 2-й автор пишет мол он прочитал первую, и в ней не совсем полиморфизм. И приводит пример. После примера пишет фразу "вся суть в концовке кода". Но концовка кода та НИЧЕМ не отличается, за исключением передачи $id в качестве параметра. Блин, это что ли он имеет ввиду? Ткните плиз носом, в чем ПРИНЦИПИАЛЬНОЕ отличие этих примеров, и почему ИМЕННО во втором "канонический" полиморфизм?
  • Вопрос задан
  • 2761 просмотр
Подписаться 5 Оценить Комментировать
Решения вопроса 2
код в статьях не отличается ничем.
за каким чертом автор №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());
  }
}
Ответ написан
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
У второго автора батхерт не на тему "что такое полиморфизм", а "о чем статья".
Он посчитал, что приведенные примеры и нить повествования больше относятся к наследованию, и у читателя не получится различить эти два понятия.

Сам же последний пример - это нормальная демонстрация полиморфизма, в обоих случаях.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
Там же написано: "Мы используем один и тот же код для объектов разных классов."
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
22 дек. 2024, в 10:44
15000 руб./за проект
22 дек. 2024, в 10:12
10000 руб./за проект
22 дек. 2024, в 09:51
3000 руб./за проект