Sobes.tech
Middle

Čo je to polymorfizmus a ako sa používa v programovaní v PHP?

sobes.tech AI

Odpoveď od AI

Polymorfizmus je možnosťou používať rovnaké rozhranie pre rôzne dátové typy. V PHP sa prejavuje v niekoľkých formách:

  1. Dedičstvo (Subtype Polymorphism): Potomkovia tried môžu prepísať metódy rodičovskej triedy a poskytovať vlastnú implementáciu. Pri volaní metódy na objekte základného typu bude skutočne vykonaná metóda z konkrétneho potomka, v závislosti od typu objektu.

    <?php
    
    class Animal {
        public function makeSound() {
            echo "Obecný zvuk zvieraťa\n";
        }
    }
    
    class Dog extends Animal {
        public function makeSound() {
            echo "Haf!\n";
        }
    }
    
    class Cat extends Animal {
        public function makeSound() {
            echo "Mňau!\n";
        }
    }
    
    function makeAnimalSound(Animal $animal) {
        $animal->makeSound(); // Volá sa metóda odpovedajúceho podtypu
    }
    
    $dog = new Dog();
    $cat = new Cat();
    
    makeAnimalSound($dog); // Výstup: Haf!
    makeAnimalSound($cat); // Výstup: Mňau!
    
  2. Rozhrania (Interface Polymorphism): Rôzne triedy môžu implementovať rovnaké rozhranie, sľubujúc poskytovanie určitej sady metód so rovnakou signatúrou. To umožňuje pracovať s objektmi rôznych tried cez jednotné rozhranie.

    <?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) { // Kontrola na rozhranie
                $totalArea += $shape->getArea();
            }
        }
        return $totalArea;
    }
    
    $shapes = [new Circle(5), new Square(4)];
    echo calculateTotalArea($shapes); // Vypíše súčet plôch kruhu a štvorca
    
  3. Abstraktné triedy (Abstract Class Polymorphism): Podobné polymorfizmu na základe rozhraní, ale umožňuje definovať základnú implementáciu pre niektoré metódy.

Polymorfizmus zvyšuje flexibilitu, rozšíriteľnosť a udržiavateľnosť kódu, umožňuje písať všeobecné algoritmy, ktoré pracujú s kolekciami objektov rôznych typov cez jednotné rozhranie.