PHP - Наследование
Наследование в ООП PHP позволяет дочернему классу наследовать все публичные и защищенные свойства и методы от родительского класса. Кроме того, дочерний класс может иметь свои собственные свойства и методы.
Примечание: Приватные методы родительского класса недоступны для дочернего класса.
Наследуемый класс определяется с помощью ключевого слова
extends.
В следующем примере класс Strawberry наследуется от класса Fruit. Это означает, что класс Strawberry может использовать публичные свойства $name и $color, а также публичные методы __construct() и intro() из класса Fruit (благодаря наследованию). Класс Strawberry также имеет собственный метод message():
Пример
<?php
// Родительский класс
class Fruit {
public
$name;
public $color;
public
function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
public function intro() {
echo "Фрукт - $this->name
и цвет - $this->color.<br>";
}
}
// Strawberry наследуется от Fruit
class
Strawberry extends Fruit {
public
function message() {
echo "Я фрукт или ягода? ";
}
}
$strawberry = new Strawberry("Клубника", "красный");
$strawberry->intro();
$strawberry->message();
?>
Попробуйте сами »
PHP - Наследование и защищенный модификатор доступа
В предыдущей главе мы узнали, что
protected свойства или методы могут быть доступны внутри класса и в классах, производных от этого класса. Что это значит?
Давайте рассмотрим пример:
Пример
<?php
class Fruit {
public
$name;
public $color;
public
function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
protected function intro() {
echo "Фрукт - $this->name
и цвет - $this->color.";
}
}
class
Strawberry extends Fruit {
public
function message() {
echo "Я фрукт или ягода? ";
}
}
// Попытка вызвать все три метода извне класса
$strawberry = new Strawberry("Клубника", "красный");
// OK. __construct() публичный
$strawberry->message(); // OK. message()
публичный
$strawberry->intro(); // ОШИБКА. intro()
защищенный
?>
Попробуйте сами »
В примере выше мы видим, что если мы попытаемся вызвать
protected метод (intro()) извне класса, мы получим ошибку.
public метод будет работать отлично!
Давайте рассмотрим другой пример:
Пример
<?php
class Fruit {
public $name;
public
$color;
public function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
protected function intro() {
echo "Фрукт - $this->name и цвет - $this->color.";
}
}
class Strawberry extends Fruit {
public function message() {
echo "Я фрукт или ягода? ";
// Вызов защищенного метода из производного класса - OK
$this ->
intro();
}
}
$strawberry = new Strawberry("Клубника", "красный"); // OK. __construct() публичный
$strawberry->message(); // OK. message() публичный и вызывает intro() (который защищен) изнутри производного класса
?>
Попробуйте сами »
В примере выше мы видим, что все работает отлично! Это потому, что мы вызываем protected метод (intro()) изнутри производного класса.
PHP - Переопределение унаследованных методов
Унаследованные методы могут быть переопределены путем повторного определения методов (с тем же именем) в дочернем классе.
Посмотрите на пример ниже. Методы __construct() и intro() в дочернем классе (Strawberry) переопределят методы __construct() и intro() в родительском классе (Fruit):
Пример
<?php
class Fruit {
public
$name;
public $color;
public
function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
public function intro() {
echo "Фрукт - $this->name
и цвет - $this->color.";
}
}
class
Strawberry extends Fruit {
public $weight;
public
function __construct($name, $color, $weight) {
$this->name = $name;
$this->color = $color;
$this->weight = $weight;
}
public function intro() {
echo "$this->name имеет цвет $this->color,
а вес составляет $this->weight грамм.";
}
}
$strawberry = new Strawberry("Клубника", "красный",
50);
$strawberry->intro();
?>
Попробуйте сами »
PHP - Ключевое слово final
Ключевое слово final может использоваться для предотвращения наследования класса или предотвращения переопределения метода.
Следующий пример показывает, как предотвратить наследование класса:
Пример
<?php
final class Fruit {
// некоторый код
}
//
приведет к ошибке
class
Strawberry extends Fruit {
// некоторый код
}
?>
Попробуйте сами »
Следующий пример показывает, как предотвратить переопределение метода:
Пример
<?php
class Fruit {
final public function intro() {
// некоторый код
}
}
class
Strawberry extends Fruit {
//
приведет к ошибке
public function intro() {
// некоторый код
}
}
?>
Попробуйте сами »