PHP ООП - Наследование
PHP - Что такое наследование?
Наследование в ООП = Когда класс наследуется от другого класса.
Дочерний класс будет наследовать все открытые и защищенные свойства и методы от родительского класса. Кроме того, он может иметь свои свойства и методы.
Унаследованный класс определяется с помощью ключевого слова extends
(в пер. с анг. - продлить, продолжить).
Давайте посмотрим на пример:
Пример
<?php
class Fruit {
public
$name;
public $color;
public
function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
public function intro() {
echo "The fruit is {$this->name}
and the color is {$this->color}.";
}
}
// Strawberry наследуется от Fruit
class
Strawberry extends Fruit {
public
function message() {
echo "Am I a fruit or a
berry? ";
}
}
$strawberry = new Strawberry("Strawberry", "red");
$strawberry->message();
$strawberry->intro();
?>
Попробуйте сами »
Объяснение примера
Класс Strawberry унаследован от класса Fruit.
Это означает, что класс Strawberry может использовать открытые свойства $name и $color, а также публичные методы __construct() и intro() из класса Fruit из-за наследования.
Класс 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 "The fruit is {$this->name}
and the color is {$this->color}.";
}
}
class
Strawberry extends Fruit {
public
function message() {
echo "Am I a fruit or a
berry? ";
}
}
// Попробуйте вызвать все три метода вне класса
$strawberry = new Strawberry("Strawberry", "red");
// OK. __construct() является публичным
$strawberry->message(); // OK. message()
является публичным
$strawberry->intro(); // ERROR. 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 "The
fruit is {$this->name} and the color is {$this->color}.";
}
}
class Strawberry extends Fruit {
public function message() {
echo "Am I a fruit or a berry? ";
// Вызовите защищенный метод из производного класса - OK
$this ->
intro();
}
}
$strawberry = new Strawberry("Strawberry", "red"); // OK. __construct() is
public
$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 "The fruit is {$this->name}
and the color is {$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 "The fruit is {$this->name}, the color is {$this->color},
and the weight is {$this->weight} gram.";
}
}
$strawberry = new Strawberry("Strawberry", "red",
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() {
// какой-то код
}
}
?>
Попробуйте сами »