Допустим, что действия этого класса нас не совсем устраивают, например, он выполняет большинство функций, необходимых нам, но не реализует некоторых других. Например, предположим, что мы хотим не просто записывать в файл журнала сообщение, но также и сохранять, в каком файле и на какой строке оно было сгенерировано . Зададимся целью создать новый класс File_Logger_Debug, расширяющий возможности класса File_Logger. Он будет добавлять ему несколько новых свойств и методов. Расширяемый класс указывается после ключевого слова extends .
<?php ## Наследование.
class File_Logger_Debug extends File_Logger
{
public function _construct($fname) {
//вызов конструктора базового класса
parent::_construct(basename($fname), $fname) ;
}
// Добавляем новый метод,
public function debug($s, $level=0) {
$stack = debug_backtrace();
$file = basename($stack[$level]['file']);
$line = $stack[$level]['line']; I
// Вызываем функцию базового класса.
$this->log(“[at $file line $line] $s”);
}
// Все остальные методы и свойства наследуются автоматически!
}
Класс File_Logger_Debug содержит те же самые свойства и методы, что и File_Logger, но помимо них и еще некоторые дополнительные, "свои". Теперь "часть File_Logger" находится прямо внутри Класса File_Logger_Debug и может быть легко доступна, наравне с методами и свойствами самого класса File_Logger_Debug. Для объекта $logger класса File_Logger_Debug допустимы выражения $logger->debug() И $logger->log() без каких бы то ни было функций-посредников.
Под переопределением метода подразумевается его описание в производном классе, в то время как в базовом он уже имеется.
Если вы переопределяете некоторый метод или свойство в производном классе, то должны указать у него такой же модификатор доступа, либо менее строгий. Например, при переопределении private-функции допускается объявлять ее как protected или public. Наоборот, если в базовом классе присутствует public-метод, то в производном он тоже должен иметь модификатор public, в противном случае РНР выдаст сообщение об ошибке.