Resumo : neste tutorial, você aprenderá sobre o conceito de polimorfismo na programação orientada a objetos. E você também aprenderá como implementar polimorfismo em PHP usando classes ou interfaces abstratas.
O que é polimorfismo?
Polimorfismo é uma palavra grega que significa literalmente muitas formas. Na programação orientada a objetos, o polimorfismo está intimamente relacionado à herança .
O polimorfismo permite que objetos de classes diferentes respondam de maneira diferente com base na mesma mensagem.
Para implementar polimorfismo em PHP, você pode usar classes abstratas ou interfaces .
O polimorfismo ajuda a criar uma estrutura genérica que aceita diferentes tipos de objetos que compartilham a mesma interface.
Posteriormente, ao adicionar um novo tipo de objeto ao sistema, não será necessário alterar a estrutura para acomodar o novo tipo de objeto, desde que ela implemente a mesma interface.
Ao usar o polimorfismo, você pode reduzir o acoplamento e aumentar a capacidade de reutilização do código.
Polimorfismo PHP usando uma classe abstrata
Primeiro, defina uma classe abstrata chamada Person
que possua um método abstrato chamado greet()
.
<?php
abstract class Person
{
abstract public function greet();
}
Linguagem de código: HTML, XML ( xml )
Segundo, defina as English
classes German
, e French
que estendem a Person
classe. O greet()
método de cada classe retorna uma mensagem de saudação diferente.
<?php
// ...
class English extends Person
{
public function greet()
{
return 'Hello!';
}
}
class German extends Person
{
public function greet()
{
return 'Hallo!';
}
}
class French extends Person
{
public function greet()
{
return 'Bonjour!';
}
}
Linguagem de código: HTML, XML ( xml )
Terceiro, defina uma função chamada greeting()
que aceite um array de Person
objetos e chame o greet()
método de cada objeto:
<?php
//...
function greeting($people)
{
foreach ($people as $person) {
echo $person->greet() . '<br>';
}
}
Linguagem de código: HTML, XML ( xml )
Quarto, defina um array de objetos das classes English
, German
e French
e passe-o para a greeting()
função:
<?php
//...
$people = [
new English(),
new German(),
new French()
];
greeting($people);
Linguagem de código: HTML, XML ( xml )
Saída:
Hello!
Hallo!
Bonjour!
Devido à implementação específica do greet()
método em cada classe, esses objetos retornam diferentes mensagens de saudação.
O diagrama de classes a seguir ilustra os relacionamentos entre as classes:
Posteriormente, se você quiser criar uma nova classe que estenda a Person
classe, não será necessário alterar a greeting()
função.
Por exemplo, você pode definir uma nova classe chamada American
que estende a Person
classe:
<?php
// ...
class American extends Person
{
public function greet()
{
return 'Hi!';
}
}
Linguagem de código: HTML, XML ( xml )
E use o objeto da American
classe na greeting()
função da seguinte forma:
<?php
// ...
$people = [
new English(),
new German(),
new French(),
new American()
];
greeting($people);
Linguagem de código: HTML, XML ( xml )
Saída:
Hello!
Hallo!
Bonjour!
Hi!
Polimorfismo PHP usando uma interface
O exemplo a seguir é igual ao anterior, exceto que usa uma interface em vez de uma classe abstrata.
Primeiro, defina uma interface chamada Greeting
que possua o greet()
método. O greet()
método retorna uma mensagem de saudação:
<?php
interface Greeting
{
public function greet();
}
Linguagem de código: HTML, XML ( xml )
Segundo, defina as classes English
, German
e French
que implementam a Greeting
interface:
<?php
// ...
class English implements Greeting
{
public function greet()
{
return 'Hello!';
}
}
class German implements Greeting
{
public function greet()
{
return 'Hallo!';
}
}
class French implements Greeting
{
public function greet()
{
return 'Bonjour!';
}
}
Linguagem de código: HTML, XML ( xml )
Terceiro, defina a greeting()
função que aceita um array de objetos que implementa a Greeting
interface:
<?php
// ...
function greeting($greeters)
{
foreach ($greeters as $greeter) {
echo $greeter->greet() . '<br>';
}
}
Linguagem de código: HTML, XML ( xml )
Finalmente, defina um array de Greeting
objetos e passe-o para a greeting()
função:
<?php
// ...
$greeters = [
new English(),
new German(),
new French(),
];
greeting($greeters);
Linguagem de código: HTML, XML ( xml )
Saída:
Hello!
Hallo!
Bonjour!
O diagrama de classes a seguir mostra os relacionamentos entre a interface e as classes:
Resumo
- O polimorfismo permite que objetos de classes diferentes respondam de maneira diferente à mesma mensagem.
- Use interfaces ou classes abstratas para implementar polimorfismo em PHP.