#7.13 php Переопределение методов базового класса. Модификаторы доступа при переопределении. Запрет переопределения (final)
Primary tabs
При наследовании одного класса от другого в порожденном классе имеется возможность создать метод с точно таким же именем, что и в базовом классе. В этом случае метод базового класса будет перекрыт, и объекты порожденного класса будут использовать новый метод вместо перекрытого метода базового класса.
Например, в классе Lion
, порожденном на основе класса Animal
, можно описать метод set_name
, который будет преобразовывать буквы имени в заглавные.
public function set_name($text) { $this->name = mb_strtoupper($text); }
При вызове методы set_name
объекта класса Lion
будет вызван этот новый метод, что и подтверждает следующий пример.
Пример 1. Переопределение методов базового класса
<HTML> <HEAD> <TITLE>Перекрытие методов</TITLE> </HEAD> <BODY> <CENTER> <H1> Перекрытие методов </H1> <?php class Animal { protected $name; public function set_name($text) { $this->name = $text; } public function get_name() { return $this->name; } } class Lion extends Animal { public function roar() { echo $this->name, " рычит! <BR>"; } public function set_name($text) { $this->name = mb_strtoupper($text); } } echo "Создание нового льва...<BR>"; $lion = new Lion(); $lion->set_name("Бонифаций"); echo $lion->roar(); ?> </CENTER> </BODY> </HTML>
На рисунке 1 можно увидеть, что в результате выполнения примера 1 был вызван именно метод порожденного класса, а не базового.
Модификаторы доступа при переопределении свойств и методов базового класса
Аналогично методам, свойства базового класса также могут быть перекрыты одноименными свойствами производного класса. При переопределении метода или свойства в порожденном классе для этого метода или свойства должен быть указан такой же модификатор доступа, как в базовом классе, или менее строгий (табл. 1)
Таблица 1. Модификаторы доступа при переопределении
Модификатор доступа свойства/метода в базовом классе | Допустимые модификаторы доступа для переопределенного свойства/метода производного класса |
public |
public |
protected |
public , protected |
private |
public , protected , private |
Например, если в базовом классе Animal
метод set_name
объявлен как public
, то в производном классе Lion
этот метод может быть объявлен только, как public
. Если же мы попытаемся использовать для этого метода другой модификатор доступа, например,
class Lion extends Animal { private function set_name($text) { $this->name = mb_strtoupper($text); } }
PHP сообщит об ошибке:Fatal error: Access level to Lion::set_name() must be public (as in class Animal)
Ключевое слово final
Для того, чтобы запретить переопределение метода в производном классе, используется модификатор final
:
class Animal { protected $name; public final function set_name($text) { $this->name = $text; } public function get_name() { return $this->name; } }
При таком описании класса Animal
попытка переопределить метод set_name
в производном классе приведет к ошибке:
Fatal error: Cannot override final method Animal::set_name()
Чтобы запретить вообще наследование класса, ключевое слово final
ставится перед определением этого класса:
final class Animal { }
- Log in to post comments
- 690 reads
mariyas
Mon, 09/25/2023 - 17:23
Permalink
добавлено: модификаторы
добавлено: модификаторы доступа при переопределении, ключевое слово final