PHP OOP - Classes Abstratas
PHP - O que são classes e métodos abstratos?
Classes e métodos abstratos são quando a classe pai tem um método nomeado, mas precisa de sua(s) classe(s) filha(s) para preencher as tarefas.
Uma classe abstrata é uma classe que contém pelo menos um método abstrato. Um método abstrato é um método declarado, mas não implementado no código.
Uma classe ou método abstrato é definido com a abstract
palavra-chave:
Sintaxe
<?php
abstract class
ParentClass {
abstract public function someMethod1();
abstract public function someMethod2($name, $color);
abstract
public function someMethod3() : string;
}
?>
Ao herdar de uma classe abstrata, o método da classe filha deve ser definido com o mesmo nome e o mesmo ou um modificador de acesso menos restrito. Portanto, se o método abstrato for definido como protegido, o método da classe filho deve ser definido como protegido ou público, mas não privado. Além disso, o tipo e o número de argumentos necessários devem ser os mesmos. No entanto, as classes filhas podem ter argumentos opcionais.
Assim, quando uma classe filha é herdada de uma classe abstrata, temos as seguintes regras:
- O método da classe filho deve ser definido com o mesmo nome e redeclara o método abstrato pai
- O método de classe filho deve ser definido com o mesmo modificador de acesso ou menos restrito
- O número de argumentos necessários deve ser o mesmo. No entanto, a classe filha pode ter argumentos opcionais além
Vejamos um exemplo:
Exemplo
<?php
// Parent class
abstract class Car {
public
$name;
public
function __construct($name) {
$this->name = $name;
}
abstract public function intro() : string;
}
// Child classes
class
Audi extends Car {
public
function intro() : string {
return "Choose German
quality! I'm an $this->name!";
}
}
class
Volvo extends Car {
public
function intro() : string {
return "Proud to be
Swedish! I'm a $this->name!";
}
}
class
Citroen extends Car {
public
function intro() : string {
return "French
extravagance! I'm a $this->name!";
}
}
// Create objects from the child classes
$audi = new
audi("Audi");
echo $audi->intro();
echo "<br>";
$volvo = new
volvo("Volvo");
echo $volvo->intro();
echo "<br>";
$citroen = new citroen("Citroen");
echo $citroen->intro();
?>
Exemplo explicado
As classes Audi, Volvo e Citroen são herdadas da classe Car. Isso significa que as classes Audi, Volvo e Citroen podem usar a propriedade public $name, bem como o método public __construct() da classe Car devido à herança.
Mas, intro() é um método abstrato que deve ser definido em todas as classes filhas e elas devem retornar uma string.
PHP - Mais Exemplos de Classes Abstratas
Vejamos outro exemplo onde o método abstract tem um argumento:
Exemplo
<?php
abstract class ParentClass {
// Abstract method
with an argument
abstract protected
function prefixName($name);
}
class ChildClass extends ParentClass {
public function prefixName($name) {
if ($name == "John Doe") {
$prefix = "Mr.";
} elseif ($name == "Jane Doe") {
$prefix =
"Mrs.";
} else {
$prefix = "";
}
return
"{$prefix} {$name}";
}
}
$class = new ChildClass;
echo $class->prefixName("John
Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>
Vejamos outro exemplo onde o método abstrato tem um argumento e a classe filha tem dois argumentos opcionais que não estão definidos no método abstrato do pai:
Exemplo
<?php
abstract class ParentClass {
// Abstract method
with an argument
abstract protected
function prefixName($name);
}
class ChildClass extends ParentClass {
// The child class may define optional arguments that are not in the parent's
abstract method
public function prefixName($name, $separator = ".",
$greet = "Dear") {
if ($name == "John Doe") {
$prefix = "Mr";
} elseif ($name == "Jane Doe") {
$prefix =
"Mrs";
} else {
$prefix = "";
}
return
"{$greet} {$prefix}{$separator} {$name}";
}
}
$class = new ChildClass;
echo $class->prefixName("John
Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>