• PHP Deel 13: Object-Oriented (OO)

    20 juli 2011 00:34 door
    OOP is meer dan een gewone techniek, het is een denkwijze die je veel tijd op lange termijn kan besparen. Hieronder volgt dan ook eerst een kleine introductie in wat OOP nu juist is en vervolgens de theorie met enkele voorbeeldjes.



    13.1 Wat theorie

    Veel programmeurs denken vaak dat ze OOP schrijven als ze gebruik maken van classes (objecten). Maar dit klopt niet geheel OOP wilt meer zeggen dan een gewoon object het is een bepaalde denkwijze die er toe aanzet een mooie structuur te bekomen die achteraf makkelijk uitbreidbaar is.

    13.1.1 Eigenschappen
    Een object stelt iets voor; neem als voorbeeld een persoon of een pen. Zo kunnen we een rode pen hebben zonder tekst erop en eentje die met zwart inkt schrijft. Maar die zelfde pen kunnen we niet zomaar van kleur laten wijzigen. We zouden hooguit er een verf laagje op kunnen leggen. In dit geval spreken we van 2 objecten die elkaar extenden en dus beinvloeden (aanpassen).

    Een object heeft eigenschappen die alleen door zichzelf gewijzigd kunnen worden maar heeft ook eigenschappen die toegelaten zijn te wijzigen al dan niet met de nodige controle erop. Om het allemaal niet te ingewikkeld te maken gaan we nu wat meer praktijk gericht.

    13.2 Praktijk gericht

    In PHP kunnen we objecten aanmaken, objecten zijn instanties van klassen. Klassen hebben properties en methods. Een simpele klasse in PHP ziet er als volgt uit:
    PHP-code:
    <?php
        
    class mijnKlasse
        
    {
            public 
    $mijnPropertie 0//Dit is een property

            
    public function drukAf()  //Dit is een method
            
    {
                echo 
    $this->var;
            }
        }
    ?>
    De richtlijnen voor de naamgeving van klasse is dezelfde als die van functies en variabele. De variabele $this verwijst altijd naar de huidige instantie, net zoals ‘me’ in Visual Basic of “this.” In Java. Deze variabele bestaat altijd in een klasse, enige uitzondering zijn logischerwijs static functions. In PHP worden methods en properties niet aangegeven met een punt maar met ->. Indien je een static method wil aanroepen gebruik je de klassenaam gevolgt door :: .

    Code:
    mijnKlasse::staticMethod();
    Een object instantieren werkt ook hier met het keyword 'new':
    PHP-code:
    <?php
        $oVoorbeeld 
    = new mijnKlasse();
    ?>
    Objecten worden in PHP altijd by reference doorgegeven, indien je toch een kopie van een object wil maken dient dit te gebeuren met de clone() functie.
    PHP-code:
    <?php
        $oVoorbeeld 
    = new mijnKlasse();
        
    $oNew $oVoorbeeld//Beide variabelen verwijzen nu naar dezelfde instantie.
        
    $oNew = clone($oVoorbeeld); //Nu is er een kopie gemaakt.
    ?>
    13.2.1 Access modifiers
    Er zijn 3 access modifiers in PHP:
    • Public: overal bereikbaar
    • Private: alleen in de klasse zelf bereikbaar
    • Protected: beschikbaar in de klasse zelf en in alle subklasse (extends)


    13.2.2 Magic Methods
    Er zijn een aantal magic methods in PHP, de namen van magic methods kunnen voor niets anders gebruikt worden.

    • __construct(): de constructor, automatische aangeroepen bij het instantieren van een object
    • __destruct(): de destructor, automatische aangeroepen bij het afbreken van een object
    • __clone(): wordt aangeroepen als het object gekopierd wordt met clone(), deze method wordt alleen in het originele object aangeroepen.


    PHP-code:
    <?php
        mijnKlasse
        
    {
            public function 
    __construct()
            {
                
    //Aangeroepen bij het instancieren
            
    }

            public function 
    __destruct()
            {
                
    //Aangeroepen bij het vernietigen
            
    }

            public function 
    __clone()
            {
                
    //aangeroepen bij clone();
            
    }
        }
    ?>
    13.2.3 Inheritance
    In PHP kunnen classes uitgebreid worden door ze te ‘extenden’, alle members van de parent-class bestaan ook in de subclasse. In de subklasse kunnen we deze overriden.

    PHP-code:
    <?php
        
    class mijnKlasse
        
    {
            protected 
    $mijnPropertie 0;
            public function 
    drukAf()
            {
                echo 
    $this->var;
            }
        }

        class 
    uitbreiding extends mijnKlasse
        
    {
            
    // In de klasse uitbreiding bestaan de members van mijnKlasse ook.
        
    }
    ?>
    13.2.4 Interfaces
    PHP biedt ook ondersteuning voor interfaces, met een interface kunnen we een specifieke functionaliteit aan een klasse toevoegen, alle members die gedefinierd zijn in de interface moeten door de klasse geimplementeerd worden.
    PHP-code:
    <?php
        
    class mijnKlasse implements mijnInterface
        
    {
            public 
    $mijnPropertie 0;

            public function 
    pasPropertieAan($nieuwewaarde)
            {
                
    $this->mijnPropertie $nieuwewaarde;
            }

            public function 
    drukAf()
            {
                echo 
    $this->mijnPropertie;
            }
        }

        interface 
    mijnInterface
        
    {
            
    # Iedere klasse die deze interface implementeerd moet ook de pasPropertiesAan() functie implementeren.
            
    public function pasPropertieAan($nieuwewaarde);
        }
    ?>
    13.2.5 Final
    Met het keyword final kunnen we vermijden dat bepaalde methods overriden worden door subklasse, een final class kan niet meer uitgebreid worden (extends), ze is final.

    PHP-code:
    <?php
        
    class mijnKlasse
        
    {
            public 
    $mijnPropertie 0;

            final public 
    doeiets()
            {
            }

            public function 
    drukAf()
            {
                echo 
    $this->var;
            }
        }

        class 
    uitbreiding extends mijnKlasse
        
    {
            public 
    doiets() {} // Fout, mag niet (is final)

            
    public function drukAf()
            {
                echo 
    'waarde: '.$this->var;
            }
        }
    ?>
    13.2.6 Abstract
    Een klasse is abstract wanneer hij nog abstracten methods bevat, we kunnen geen instantie aanmaken van een abstracte klasse, we kunnen ze alleen als parent-class gebruiken.

    PHP-code:
    <?php
        
    abstract class mijnKlasse
        
    {
            public 
    $mijnPropertie 0;

            abstract public function 
    drukAf();
        }

        
    $oNew = new mijnKlasse( ); // Werkt niet
    ?>
    13.2.7 Instanceof
    Met het keyword ‘instanceof’ kunnen we controleren of een object een instantie is van een bepaalde klasse:
    PHP-code:
    <?php
        $oNew 
    = new mijnKlasse( ); //Werkt niet

        
    if($oNew instanceof mijnKlasse)
            echo 
    ‘Instantie van mijnKlasse’;

    ?>
    Static members (zowel properties als methods) zijn bereikbaar zonder dat er een instantie van de klasse nodig is, logischerwijs kunnen we in static methods ook alleen static properties gebruiken, ook werkt de pseudo variabele $this niet in een static method. Static members zijn wel beschikbaar voor instanties, ze moeten echter aangeroepen worden met ‘klassenaam::Member’ en niet met $this.

    PHP-code:
    <?php
        
    class mijnKlasse
        
    {
            public static 
    $mijnPropertie 0;
            public 
    $test;

            public static function 
    drukAf()
            {
                
    $var $this->test//Fout
                
    $var $this->mijnPropertie//Fout
                
    $var mijnKlasse::mijnPropertie//juist
            
    }
        }

        
    $oNew = new mijnKlasse();
        
    $oNew->test ‘Hallo’//Goed
        
    $oNew->drukAf(); //Fout
        
    $mijnKlasse::drukAf(); //Goed
    ?>
    13.2.8 Type hinting
    In PHP kunnen we eisen dat bepaalde parameters een instantie zijn van een bepaalde klasse.

    PHP-code:
    <?php
        
    class mijnKlasse
        
    {
            public 
    $mijnPropertie 0;

            public function 
    drukAf(mijnKlasse $a)
            {
                echo 
    $a->mijnPropertie;
            }
        }
    ?>
    In bovenstaand voorbeeld kan de method drukAf alleen aangeroepen worden met een object van het type mijnKlasse. Dit werkt evenveens voor array’s:

    Code:
    public function drukAf(array $a) { }
    Geschreven door: Martijn Croonen.
    Aanpassingen door: Aerts Kurt.