OOP: APIE (polymorphism)

July 18th, 2012 | 3 min read | Coding rules, Object oriënted, PHP

De tweede grote peiler in ons hele APIE-verhaal is polymorfisme. Polymorf wilt zeggen dat het vele (poly) vormen (morf) kan aannemen. In programmeertalen met strong typing is polymorfisme zeer belangrijk, en zorgt het ervoor dat we zowel ‘Kippen’ als ‘Eenden’ op dezelfde manier kunnen behandelen.

Heads up!

Deze tutorial sluit aan bij mijn vorige tutorial in de reeks van OOP tutorials, APIE (abstraction).

In PHP daarentegen is dit een heel ander verhaal. In PHP kan je namelijk sowieso al alles op dezelfde manier behandelen, omdat we eender welk type in onze variabelen kunnen steken. Doch wil ik deze term uitleggen, omdat ze gewoon heel belangrijk is in andere talen (C#, Java, …).

Stel dat we een lijst willen bijhouden van alle kippen en eenden, dan kunnen we dit eigenlijk veralgemenen en zeggen dat we een lijst willen van alle vogels. Omdat we een superclass voorzien hebben voor alle vogels, kunnen we met 100% zekerheid al deze methodes uitvoeren, alle objecten in de lijst moeten immers van de class Vogel afleiden.

<?php

abstract class Vogel {

        private $naam;

        public function __construct($naam) {
                $this->naam = $naam;
        }

        public function GetNaam() {
                return $this->naam;
        }

        public abstract function Beweeg();
}

class Kip extends Vogel {

        public function Beweeg() {
                return "*Loopt*";
        }
}

class Eend extends Vogel {

        public function Beweeg() {
                return "*Zwemt*";
        }

        public function GetNaam() {
                return parent::GetNaam() . " Duck";
        }
}

$lijst = array (
        new Kip("Foghorn Leghorn"),
        new Eend("Donald"),
        new Eend("Daffy"),
        new Eend("Daisy"),
        new Kip("Kieke"));
foreach ($lijst as $vogel) {
        if (get_parent_class($vogel) == "Vogel")
                echo $vogel->GetNaam() ."<br />";
}

?>

In PHP moeten we jammer maar helaas een extra controle toevoegen om er zeker van te zijn dat we met een derived class (afgeleide class/sub class) van Vogel bezig zijn.
Polymorfisme is zeer handig als je je code wilt uitbreiden, als je vanaf nu een lijst wilt maken van kippen, eenden, duiven en meeuwen, dan hoef je enkel deze classes te voorzien, ervoor zorgen dat ze afleiden van Vogel en ze aan de lijst toevoegt.

Weak typing is in mijn ogen één van de grote nadelen van PHP. Het maakt vele zaken gemakkelijker, maar soms mag het niet makkelijk gaan en wil je regels opleggen aan de toekomstige developers. Om het zelfs helemaal af te maken: bij exceptions in PHP kan je wel aan strong typing doen… .

Back to tutorialsContact me on TwitterDiscuss on Twitter

Profile picture

Dimitri "g00glen00b" Mestdagh is a consultant at Cronos and tech lead at Aquafin. Usually you can find him trying out new libraries and technologies. Loves both Java and JavaScript.