При вызове функции базового класса используется особый синтаксис с ключевым словом parent, например: parent::_ construct(...);
При написании метода вы можете явно запретить его переопределение в производных классах, используя модификатор final.
<?php ## Финальные методы,
class Base {
public final function test() {}
}
class Derive extends Base {
public function test() {} // Ошибка! Нельзя переопределить!
}
?>
В РНР, как и в Java, можно не только запретить переопределение методов, но и запретить наследование от указанного класса вообще. Для этого ключевое слово final необходимо поставить перед определением класса
final class Base {}
// Теперь нельзя создавать классы, производные от Base.
Используйте final при описании класса только в тех случаях, когда это абсолютно необходимо, и вы уверены, что наследование к классу неприменимо.
Полиморфизм — это способность объекта использовать методы не своего собственного класса, а производного, даже если на момент определения базового класса производный еще не существует.
Обычно при объяснении полиморфизма демонстрируют пример программы, выводящей различные геометрические фигуры (круги, квадраты, треугольники и т. д.) и позволяющей однотипно ими манипулировать (изменять размеры, передвигать и т. д.). С использованием полиморфизма вы можете писать классы-шаблоны, реализующие некоторую функциональность лишь частично, и лишь в той степени, в которой она им самим "известна". В дальнейшем, создавая производные классы, вы можете уточнить остальную часть кода, специфичную для вашего приложения. Пусть в программе имеется класс shape, соответствующий некоторой геометрической фигуре. Программа должна уметь выполнять два действия: 1)перемещать фигуры при вызове метода moveBy(); 2) увеличивать или уменьшать размер фигуры с вызовом метода resizeBy().
Мы не уточняем, какой именно фигуре (квадрату, кругу, треугольнику и т. д.) соответствует объект shape. Мы хотим свободно добавлять все новые типы фигур (square, circle, Triangle), ведущие себя похожим образом и удовлетворяющие все тем же жестким требованиям.
<?php ## Базовый класс — геометрическая фигура,
class Shape {
// Любая фигура имеет координаты центра, а также масштаб.
private $х=0, $у=0, $scale=1.0;
// Конструктор класса. Отображает фигуру на экране.
public function _construct() {
$this->show() ;
}
// Деструктор класса. Стирает фигуру с экрана,
public function _destruct() {
$this->hide();
}
// Переместить фигуру на ($dx, $dy) точек,
public final function moveBy($dx, $dy) {
// Вначале стираем фигуру с экрана.
$this->hide();
// Затем изменяем координаты.
$this->x += $dx;
$this->y += $dy;
// Наконец, выводим фигуру на новом месте.
$this->show();
}
// Изменить масштаб отображения фигуры,
public final function resizeBy($coef) {
$this->hide();
$this->scale *= $coef;
$this->show();
}
// Методы возвращают координаты центра и масштаб.
public final function getCoord() { return array($this->x, $this->y); }
public final function getScale() { return $this->scale; }
protected function hide() {
die();
}
protected function show() {
die();
}
}
?>
Для гарантии того, что все геометрические фигуры будут вести себя одинаково, мы объявляем public методы финальными (final). Таким образом, их уже нельзя будет переопределить в производных классах, а значит, фигуры не смогут вести себя по другому.