код в статьях не отличается ничем.
за каким чертом автор №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());
}
}