Resumo : neste tutorial, você aprenderá como chamar o construtor pai a partir do construtor da classe filha.
A classe filha não tem um construtor
No tutorial de herança , você aprendeu como definir a SavingAccount
classe que herda a BankAccount
classe:
Entretanto, não discutimos os construtores das classes pai e filho no contexto da herança.
O seguinte adiciona um construtor à BankAccount
classe, que aceita o $balance
parâmetro. O construtor atribui o $balance
argumento à $balance
propriedade:
<?php
class BankAccount
{
private $balance;
public function __construct($balance)
{
$this->balance = $balance;
}
public function getBalance()
{
return $this->balance;
}
public function deposit($amount)
{
if ($amount > 0) {
$this->balance += $amount;
}
return $this;
}
}
Linguagem de código: HTML, XML ( xml )
A SavingAccount
classe permanece a mesma e não inclui seu próprio construtor:
<?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);
}
}
Linguagem de código: HTML, XML ( xml )
Quando você cria uma nova instância do SavingAccount
, o PHP chamará o construtor da SavingAccount
classe. No entanto, o PHP não consegue encontrar o construtor no arquivo SavingAccount class
. Portanto, ele continua procurando o construtor da classe pai da SavingAccount
classe, que é a BankAccount
classe. E invoca o construtor da BankAccount
classe.
Se você não passar um argumento para o construtor da SavingAccount
classe, receberá um erro:
$account = new SavingAccount();
Linguagem de código: PHP ( php )
Erro:
Fatal error: Uncaught ArgumentCountError: Too few arguments to function BankAccount::__construct(), 0 passed in ... on line 5 and exactly 1 expected in ...
Linguagem de código: JavaScript ( javascript )
Mas se você passar um argumento para o construtor, funcionará perfeitamente:
$account = new SavingAccount(100);
Linguagem de código: PHP ( php )
Defina um construtor na classe filha
Uma classe filha pode ter seu próprio construtor. Por exemplo, você pode adicionar um construtor à SavingAccount
classe da seguinte maneira:
<?php
class SavingAccount extends BankAccount
{
private $interestRate;
public function __construct($interestRate)
{
$this->interestRate = $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);
}
}
Linguagem de código: HTML, XML ( xml )
A SavingAccount
classe possui um construtor que inicializa a interestRate
propriedade.
Quando uma classe filha tem seu próprio construtor, o construtor da classe filha não chamará o construtor de sua classe pai automaticamente.
Por exemplo, o seguinte cria uma nova instância da SavingAccount
classe e inicializa a $interestRate
propriedade com o valor0.05
$account = new SavingAccount(0.05);
Linguagem de código: PHP ( php )
Para chamar o construtor da classe pai a partir do construtor da classe filha, você usa a parent::__construct(arguments)
sintaxe.
A seguir altera o construtor da SavingAccount
classe que aceita dois argumentos: saldo e taxa de juros. Também chama o construtor da BankAccount
classe para inicializar a $balance
propriedade:
<?php
class SavingAccount extends BankAccount
{
private $interestRate;
public function __construct($balance, $interestRate)
{
parent::__construct($balance);
$this->interestRate = $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);
}
}
Linguagem de código: HTML, XML ( xml )
A sintaxe para chamar o construtor pai é a mesma de um método regular.
Junte tudo:
<?php
class BankAccount
{
private $balance;
public function __construct($balance)
{
$this->balance = $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 __construct($balance, $interestRate)
{
parent::__construct($balance);
$this->interestRate = $interestRate;
}
public function setInterestRate($interestRate)
{
$this->interestRate = $interestRate;
}
public function addInterest()
{
$interest = $this->interestRate * $this->getBalance();
$this->deposit($interest);
}
}
$account = new SavingAccount(100, 0.05);
$account->addInterest();
echo $account->getBalance();
Linguagem de código: HTML, XML ( xml )
O diagrama de classes a seguir ilustra a herança entre as classes SavingAccount
e :BankAccount
Resumo
- O construtor da classe filha não chama automaticamente o construtor da classe pai.
- Use
parent::__construct(arguments)
para chamar o construtor pai do construtor na classe filha.