Как уже говорилось, если вы собираетесь расширить класс позже, вы всегда можете изменить его.
Но если вы можете избежать использования наследования, вам следует. При проектировании лучше использовать другие шаблоны, если это возможно.
По сути, нужно отдавать предпочтение композиции, а не наследованию и программированию для интерфейсов, а не для реализаций.
Если вы позволите классам иметь только одно строго определенное назначение, вы можете составлять объекты, а не позволять им наследовать друг друга. Если вы используете интерфейсы, а не наследование, вы, скорее всего, определите маленькие и эффективные интерфейсы. Тогда вы увидите, что наследование сократится, и, следовательно, потребность в защите уменьшится до.
Пример
interface sound {
public function makeSound();
}
class bark implements sound{
public function makeSound() {
return "Bark!!!";
}
}
class mew implements sound{
public function makeSound() {
return "Mewmew!!!";
}
}
class forLeggedAnimal {
private $sound;
public function forLeggedAnimal($sound){
$this->sound = $sound;
}
public function eat(){
echo $this->sound->makeSound();
}
}
$cat = new forLeggedAnimal(new mew());
$dog = new forLeggedAnimal(new bark());
Я знаю, что это далеко не идеальный пример. Но это иллюстрирует технику, и вы можете использовать это многими способами. Например, вы можете комбинировать это с различными творческими образцами, чтобы строить кошек и собак, возможно, не очень разумно знать, лает ли кошка или мяукает ... Но в любом случае ... это отличается от необходимости создавать базовый класс и затем расширять это с кошкой и собакой, и поэтому должен сделать "надежный" метод защищенным или перекрывающим метод общественного питания
/ Петр