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 "Gksl ' {$this->name} і колір є {$this->color}.";
}
}
// Strawberry успадкована від Fruit
class Strawberry extends Fruit {
public function message() {
echo "Я фрукт чи ягода? ";
}
}
$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 "Плід є {$this->name} і колір є {$this->color}.";
}
}
class Strawberry extends Fruit {
public function message() {
echo "Я фрукт чи ягода? ";
}
}
// Спробуйте викликати всі три методи поза класом
$strawberry = new Strawberry("Strawberry", "red"); // OK. __construct() is public
$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 "Плід є {$this->name} і колір є {$this->color}.";
}
}
class Strawberry extends Fruit {
public function message() {
echo "Я фрукт чи ягода? ";
// Виклик захищеного методу з похідного класу - OK
$this -> intro();
}
}
$strawberry = new Strawberry("Strawberry", "red"); // 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} 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() {
// якийсь код
}
}
?>
Спробуйте самі »