Как только собаки могут играть "извлечения", является ли этот пример хорошей или плохой идеей? Я подозреваю, что это действительно плохая идея из-за использования instanceof, но я не совсем уверен, почему.
class Animal {
    var $name;
    function __construct($name) {
        $this->name = $name;
    }
}
class Dog extends Animal {
    function speak() {
        return "Woof, woof!";
    }
    function playFetch() {
        return 'getting the stick';
    }
}
class Cat extends Animal {
    function speak() {
        return "Meow...";
    }
}
$animals = array(new Dog('Skip'), new Cat('Snowball'));
foreach($animals as $animal) {
    print $animal->name . " says: " . $animal->speak() . '<br>';
    if ($animal instanceof Dog) echo $animal->playFetch();
}
Другой пример. Поскольку я постоянно создаю объекты данных, у которых есть ID, я решил, что я мог бы также расширить их все из базового класса, чтобы избежать дублирования кода. Опять же, это было плохо? Поскольку у председателя нет имени, а у собаки нет колес. Но они являются обоими объектами данных, поэтому они очень запутывают.
class Data_Object {
    protected $_id;
    function setId($id) {
        $this->_id = $id;
    }
    function getId() {
        return $this->_id;
    }
}
class Dog extends Data_Object {
    protected $_name;
    function setName($name) {
        $this->_name = 
    }
    function getName() {
        return $this->_name;
    }
}
class Chair extends Data_Object {
    protected $_numberOfWheels;
    function setNumberOfWheels($number) {
        $this->_numberOfWheels = $number;
    }
    function getNumberOfWheels() {
        return $this->_numberOfWheels;
    }
}
По сути, я думаю, что я спрашиваю: "должны ли все подклассы иметь один и тот же интерфейс или могут иметь разные?"