Sobes.tech
Middle

¿Qué es el polimorfismo y cómo se utiliza en la programación en PHP?

sobes.tech AI

Respuesta de la IA

El polimorfismo es la capacidad de usar una misma interfaz para diferentes tipos de datos. En PHP, se manifiesta en varias formas:

  1. Herencia (Polimorfismo por subtipos): Las clases hijas pueden redefinir los métodos de la clase padre, proporcionando su propia implementación. Al llamar a un método en un objeto de tipo base, en realidad se ejecutará el método de la clase hija específica, dependiendo del tipo del objeto.

    <?php
    
    class Animal {
        public function makeSound() {
            echo "Sonido genérico de animal\n";
        }
    }
    
    class Dog extends Animal {
        public function makeSound() {
            echo "¡Guau!\n";
        }
    }
    
    class Cat extends Animal {
        public function makeSound() {
            echo "¡Miau!\n";
        }
    }
    
    function makeAnimalSound(Animal $animal) {
        $animal->makeSound(); // Se llama al método del subtipo correspondiente
    }
    
    $dog = new Dog();
    $cat = new Cat();
    
    makeAnimalSound($dog); // Salida: ¡Guau!
    makeAnimalSound($cat); // Salida: ¡Miau!
    
  2. Interfaces (Polimorfismo por interfaz): Diferentes clases pueden implementar la misma interfaz, prometiendo proporcionar un conjunto definido de métodos con la misma firma. Esto permite trabajar con objetos de diferentes clases a través de una interfaz común.

    <?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) { // Verificación de interfaz
                $totalArea += $shape->getArea();
            }
        }
        return $totalArea;
    }
    
    $shapes = [new Circle(5), new Square(4)];
    echo calculateTotalArea($shapes); // Muestra la suma de las áreas del círculo y el cuadrado
    
  3. Clases abstractas (Polimorfismo por clase abstracta): Similar al polimorfismo basado en interfaces, pero permite definir una implementación base para algunos métodos.

El polimorfismo aumenta la flexibilidad, extensibilidad y mantenibilidad del código, permitiendo escribir algoritmos genéricos que trabajan con colecciones de objetos de diferentes tipos a través de una interfaz común.