Como chamar o construtor pai

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 SavingAccountclasse que herda a BankAccountclasse:

herança php

Entretanto, não discutimos os construtores das classes pai e filho no contexto da herança.

O seguinte adiciona um construtor à BankAccountclasse, que aceita o $balanceparâmetro. O construtor atribui o $balanceargumento à $balancepropriedade:

<?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 SavingAccountclasse 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 SavingAccountclasse. No entanto, o PHP não consegue encontrar o construtor no arquivo SavingAccount class. Portanto, ele continua procurando o construtor da classe pai da SavingAccountclasse, que é a BankAccountclasse. E invoca o construtor da BankAccountclasse.

Se você não passar um argumento para o construtor da SavingAccountclasse, 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 à SavingAccountclasse 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 SavingAccountclasse possui um construtor que inicializa a interestRatepropriedade.

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 SavingAccountclasse e inicializa a $interestRatepropriedade 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 SavingAccountclasse que aceita dois argumentos: saldo e taxa de juros. Também chama o construtor da BankAccountclasse para inicializar a $balancepropriedade:

<?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 SavingAccounte :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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *