Наследование позволяет классу повторно использовать код другого класса без его дублирования.
При наследовании у вас есть родительский класс со свойствами и методами, а дочерний класс может использовать код из родительского класса.
Наследование позволяет писать код в родительском классе и использовать его как в родительском, так и в дочернем классах.
Чтобы определить класс, наследуемый от другого класса, используется ключевое слово extends.
Предположим, у вас есть класс с именем BankAccount, как показано ниже:
<?php
class BankAccount
{
private $balance;
public function getBalance()
{
return $this->balance;
}
public function deposit($amount)
{
if ($amount > 0) {
$this->balance += $amount;
}
return $this;
}
}
Класс BankAccount имеет private свойство $balance и общедоступные методы getBalance() и deposit().
Чтобы объявить, что класс SavingAccount наследуется от BankAccount, используем ключевое слово extends следующим образом:
<?php
class SavingAccount extends BankAccount
{
}
В этом примере класс SavingAccount может повторно использовать все не private свойства и методы из класса BankAccount.
В следующем примере создаем новый экземпляр класса SavingAccount, вызываем метод deposit(), который и показывает баланс:
<?php
require 'SavingAccount.php';
$account = new SavingAccount();
$account->deposit(100);
echo $account->getBalance();
В этом примере класс SavingAccount повторно использует свойства и методы из класса BankAccount.
Дочерний класс может повторно использовать свойства и методы родительского класса. Но родительский класс не может использовать свойства и методы дочернего класса.
Дочерний класс может иметь свои собственные свойства и методы. В следующем примере мы добавляем свойство $interestRate и метод setInterestRate() в класс SavingAccount:
<?php
class SavingAccount extends BankAccount
{
private $interestRate;
public function setInterestRate($interestRate)
{
$this->interestRate = $interestRate;
}
}
Чтобы вызвать метод из родительского класса, используется ключевое слово $this.
В следующем примере определяется метод addInterest(), который вычисляет проценты и добавляет их к балансу:
<?php
class SavingAccount extends BankAccount
{
private $interestRate;
public function setInterestRate($interestRate)
{
$this->interestRate = $interestRate;
}
public function addInterest()
{
// calculate interest
$interest = $this->interestRate * $this->getBalance();
// deposit interest to the balance
$this->deposit($interest);
}
}
В методе addInterest() мы вызываем метод getBalance() из класса BankAccount для расчета процентов и метод deposit() для добавления процентов к балансу.
Покажем все это вместе:
<?php
class BankAccount
{
private $balance;
public function getBalance()
{
return $this->balance;
}
public function deposit($amount)
{
if ($amount > 0) {
$this->balance += $amount;
}
return $this;
}
}
class SavingAccount extends BankAccount
{
private $interestRate;
public function setInterestRate($interestRate)
{
$this->interestRate = $interestRate;
}
public function addInterest()
{
// calculate interest
$interest = $this->interestRate * $this->getBalance();
// deposit interest to the balance
$this->deposit($interest);
}
}
$account = new SavingAccount();
$account->deposit(100);
// set interest rate
$account->setInterestRate(0.05);
$account->addInterest();
echo $account->getBalance();
Для представления отношения наследования используется открытая стрелка от дочернего класса к родительскому классу. Следующая диаграмма UML показывает отношения наследования между классами BankAccount и SavingAccount: