Sobes.tech
Middle

O que é polimorfismo e como é utilizado na programação PHP?

sobes.tech IA

Resposta da IA

O polimorfismo é a capacidade de usar uma mesma interface para diferentes tipos de dados. Em PHP, manifesta-se de várias formas:

  1. Herança (Polimorfismo por Subtipo): As classes filhas podem redefinir os métodos da classe pai, fornecendo a sua própria implementação. Quando um método é chamado num objeto de tipo base, na realidade será executado o método da classe filha específica, dependendo do tipo do objeto.

    <?php
    
    class Animal {
        public function makeSound() {
            echo "Som genérico de animal\n";
        }
    }
    
    class Dog extends Animal {
        public function makeSound() {
            echo "Au!\n";
        }
    }
    
    class Cat extends Animal {
        public function makeSound() {
            echo "Miau!\n";
        }
    }
    
    function makeAnimalSound(Animal $animal) {
        $animal->makeSound(); // Chamada ao método do subtipo correspondente
    }
    
    $dog = new Dog();
    $cat = new Cat();
    
    makeAnimalSound($dog); // Saída: Au!
    makeAnimalSound($cat); // Saída: Miau!
    
  2. Interfaces (Polimorfismo por Interface): Diferentes classes podem implementar a mesma interface, prometendo fornecer um conjunto definido de métodos com a mesma assinatura. Isto permite trabalhar com objetos de diferentes classes através de uma interface comum.

    <?php
    
    interface Shape {
        public function getArea();
    }
    
    class Circle implements Shape {
        private $radius;
    
        public function __construct($radius) {
            $this->radius = $radius;
        }
    
        public function getArea() {
            return pi() * $this->radius * $this->radius;
        }
    }
    
    class Square implements Shape {
        private $side;
    
        public function __construct($side) {
            $this->side = $side;
        }
    
        public function getArea() {
            return $this->side * $this->side;
        }
    }
    
    function calculateTotalArea(array $shapes) {
        $totalArea = 0;
        foreach ($shapes as $shape) {
            if ($shape instanceof Shape) { // Verificação da interface
                $totalArea += $shape->getArea();
            }
        }
        return $totalArea;
    }
    
    $shapes = [new Circle(5), new Square(4)];
    echo calculateTotalArea($shapes); // Mostra a soma das áreas do círculo e do quadrado
    
  3. Classes Abstratas (Polimorfismo por Classe Abstrata): Semelhante ao polimorfismo baseado em interfaces, mas permite definir uma implementação base para alguns métodos.

O polimorfismo aumenta a flexibilidade, extensibilidade e manutenção do código, permitindo escrever algoritmos genéricos que trabalham com coleções de objetos de diferentes tipos através de uma interface comum.