PHP OOP - Herança
PHP - O que é herança?
Herança em OOP = Quando uma classe deriva de outra classe.
A classe filha herdará todas as propriedades e métodos públicos e protegidos da classe pai. Além disso, pode ter suas próprias propriedades e métodos.
Uma classe herdada é definida usando a palavra- extends
chave.
Vejamos um exemplo:
Exemplo
<?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 is inherited from 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();
?>
Exemplo explicado
A classe Strawberry é herdada da classe Fruit.
Isso significa que a classe Strawberry pode usar as propriedades public $name e $color, bem como os métodos public __construct() e intro() da classe Fruit por causa da herança.
A classe Strawberry também possui seu próprio método: message().
PHP - Herança e o modificador de acesso protegido
No capítulo anterior aprendemos que protected
propriedades ou métodos podem ser acessados dentro da classe e por classes derivadas dessa classe. O que isso significa?
Vejamos um exemplo:
Exemplo
<?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? ";
}
}
// Try to call all three methods from outside class
$strawberry = new Strawberry("Strawberry", "red");
// OK. __construct() is public
$strawberry->message(); // OK. message()
is public
$strawberry->intro(); // ERROR. intro()
is protected
?>
No exemplo acima vemos que se tentarmos chamar um protected
método (intro()) de fora da classe, receberemos um erro. public
métodos funcionarão bem!
Vejamos outro exemplo:
Exemplo
<?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? ";
// Call protected
method from within derived class - OK
$this ->
intro();
}
}
$strawberry = new Strawberry("Strawberry", "red"); // OK. __construct() is
public
$strawberry->message(); // OK. message() is
public and it calls intro() (which is protected) from within the
derived class
?>
No exemplo acima vemos que tudo funciona bem! É porque chamamos o
protected
método (intro()) de dentro da classe derivada.
PHP - Sobrescrevendo métodos herdados
Os métodos herdados podem ser substituídos redefinindo os métodos (use o mesmo nome) na classe filha.
Veja o exemplo abaixo. Os métodos __construct() e intro() na classe filha (Strawberry) substituirão os métodos __construct() e intro() na classe pai (Fruit):
Exemplo
<?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 - A palavra-chave final
A final
palavra-chave pode ser usada para evitar herança de classe ou para evitar substituição de método.
O exemplo a seguir mostra como evitar herança de classe:
Exemplo
<?php
final class Fruit {
// some code
}
//
will result in error
class
Strawberry extends Fruit {
// some code
}
?>
O exemplo a seguir mostra como evitar a substituição do método:
Exemplo
<?php
class Fruit {
final public function intro() {
// some code
}
}
class
Strawberry extends Fruit {
//
will result in error
public function intro() {
// some code
}
}
?>