Veel beginnende php-ers hebben moeite met OOP. Vaak hebben ze moeite met het begrijpen waar OOP nou eigenlijk voor dient en hoe je dit dan het beste kunt gebruiken. In deze tutorial zal ik uitleggen wat het idee achter OOP is en de basis van hoe je dit gebruikt.

In deze tutorial ga ik er wel vanuit dat je minimaal PHP versie 5.* gebruikt, voor deze versie is de ondersteuning van OOP namelijk heel slecht.

Dus.. wat is OOP nou eigenlijk?

OOP staat voor object oriented programming. Dit is dus het gebruiken van objecten bij het programmeren. Vaak wordt OOP met klassen (classes) verward, maar dit is niet helemaal het zelfde, OOP gaat namelijk ook over de manier waarop je die gebruikt enzovoort.

OOP bestaat trouwens niet in PHP, maar in de meeste andere talen. Van alle talen waarin OOP ondersteund wordt is de ondersteuning van PHP zelfs een van de minst uitgebreide.

Oke! Maar wat zijn die klassen dan?

De basis van OOP zijn de klassen. Een klasse (class in PHP) kun je wel zien als een blauwdruk of gewoon een object (daar komt de eerste O in OOP dus vandaan ;) ). In een klasse stop je methods. Dit zijn eigenlijk gewoon functies, maar dan in een klasse. Daarnaast kun je er ook variabelen in stoppen. Eigenlijk is een klasse dus een verzameling van functies die over gezamenlijke variabelen beschikken.

Juist ja, maar wat is dan het nut? Kan ik niet gewoon functies gebruiken?

Het nut van een functie is, dat je een bepaald stuk code op meerdere plaatsen kunt gebruiken, terwijl je de code maar één keer typt! Het nut van een klasse is dat je verschillende functies samen laat werken. In sommige gevallen is het dus handiger om functies te gebruiken en in sommige gevallen is het handiger om klassen te gebruiken.

Hoe maak ik dan zo’n klasse?

Even geduld, ik heb eerst nog één kleine opmerking. Ik ga in deze tut een voorbeeld van een klasse voor een auto gebruiken, natuurlijk heb je hier niets aan in je code, maar het is wel handig om aan te tonen wat je met klassen kunt!

Een klasse openen in PHP is nog makkelijker dan een functie openen, je doet namelijk gewoon dit (let op, de naam is net zoals bijna alles in PHP hoofdlettergevoelig):

[code lang="php"] class Auto
{
}
?>[/code]

Een klasse op zich kan niet erg veel.. sterker nog, het kan helemaal niets! Elke keer als je een bepaalde klasse wilt gebruiken (je kunt elke klasse natuurlijk vaker gebruiken, zelfs tegelijkertijd), moet je er een instantie van maken. Vanuit deze instantie gaan we later ook weer de methods aanroepen.

Het maken van een instantie doe je zo:

[code lang="php"] $bmw = new Auto(); //Dit wordt mijn BMW!
$ferrari = new Auto(); //Dit wordt mijn Ferrari, omdat de variabele naam anders is dan die van de BMW, zullen ze elkaar niet lastig vallen!
?>[/code]

Maar, hier kan ik toch helemaal niets mee?

Dat heb je heel goed gezien! Om er wel iets mee te kunnen gaan we nu eerst variabelen toe voegen. Deze variabelen zijn wel iets anders dan gewone variabelen, je kunt ze namelijk: private, protected en public maken.

  • Private variabelen kunnen alleen worden benaderd vanuit de klasse waarvan ze onderdeel zijn.
  • Protected variabelen kunnen alleen worden benaderd vanuit de klasse waarvan ze onderdeel zijn en vanuit klassen die een aanvulling zijn op deze klasse.
  • Public variabelen kunnen ‘overal’ vandaan worden benaderd.

Een variabele moet aan het begin van de klasse worden aangegeven, je kunt daar kiezen voor het soort variabele, de naam van de variabele en eventueel de waarde. Dit kun je zo doen:

[code lang="php"] [type] $[naam]; //variabele zonder waarde
[type] $[naam] = [waarde]; //variabele met waarde
?>[/code]

Laat me dan nu variabelen toevoegen aan onze klasse!

In onze klasse gaan we variabelen gebruiken om de kenmerken van onze auto aan te geven: merk, kleur, snelheid, nummerbord, lichten (aan/uit). Dan krijgen we dus zoiets:

[code lang="php"] class Auto
{
public $merk = 'onbekend';
public $kleur = ‘onbekend';
public $nummerbord = 'on-be-kend';
protected $snelheid = 0;
protected $lichten = false; //lichten standaard uit
}
?>[/code]

Het is niet nodig om de public variabelen van de protected variabelen te scheiden, maar dat doe ik hier gewoon voor de duidelijkheid.

Ik wil de variabelen nu kunnen aanpassen!

Om dingen uit een instantie te benaderen gebruik je in PHP -> . In ons voorbeeld kunnen we dus dit gebruiken:

[code lang="php"] $bmw = new Auto(); //Dit wordt mijn BMW!
$ferrari = new Auto(); //Dit wordt mijn Ferrari, omdat de variabele naam anders is dan die van de BMW, zullen ze elkaar niet lastig vallen!

$ferrari->merk = ‘Ferrari’;
$ferrari->kleur = ‘rood’ ;
$ferrari->nummerbord = ‘PH-PO-OP’;

echo $ferrari->merk . ‘ ‘; //Ferrari
echo $ferrari->kleur . ‘’; //rood
echo $ferrari->nummerbord . ‘

‘; //PH-PO-OP

echo $bmw->merk . ‘

‘ ; //onbekend

$bmw->merk = ‘BMW’;

echo $bmw->merk; //BMW
?>[/code]

Tja, een auto, maar hij kan toch helemaal niets!

Om de auto dingen te laten doen, gaan we de methods gebruiken, maar wat wel handig is om eerst te weten: variabelen van de klasse kun je binnen de klasse aanroepen met $this.

Omdat een method ongeveer het zelfde is als een functie, is de manier hoe je hem aanmaakt ook ongeveer hetzelfde. Het enige verschil is, dat je weer private, protected en public moet gebruiken! Dit doe je dan dus zo:

[code lang="php"] [type] function [naam]([parameters])
{
}
?>[/code]

Laten we dit dan maar aan onze klasse toe gaan voegen, zodat het eindelijk echt ergens op begint te lijken!

[code lang="php"] class Auto
{
public $merk = ‘onbekend';
public $kleur = ‘onbekend';
public $nummerbord = ‘on-be-kend';
protected $snelheid = 0;
protected $lichten = false; //lichten standaard uit

public function geefGas($snelheid = 5)
{
$this->snelheid += $snelheid; //Let op dat je hier niet in de war raakt!

echo ‘Vroem!’; //normaal echo je niet in een method, maar anders wordt het wel erg omslachtig!
}

public function geefMinderGas($snelheid = 5)
{
$this->snelheid -= $snelheid; //natuurlijk kun je dit ook bereiken met de vorige method, bij een snelheid van -5 ;)

echo ‘Pfffff!’;
}

public function handrem()
{
$snelheid = $this->snelheid; //de oude snelheid bewaren

$this->snelheid = 0;

echo ‘IIIIIIIEEEEEEEE!’;

$this->botsing($snelheid); //roep een andere method aan
}

public function switchLichten()
{
$this->lichten = !$this->lichten;

return $this->lichten;
}

private function botsing($beginsnelheid)
{
if(!rand(0, 9) || $beginsnelheid > 100 || $beginsnelheid < -100)
{
echo ‘BOEM!';
}
}
}
?>[/code]

Hoe gebruik ik deze methods?

Een method gebruiken is het zelfde als een variabele gebruiken! We kunnen nu dus bijvoorbeeld zo’n code krijgen:

[code lang="php"]
$bmw = new Auto(); //Dit wordt mijn BMW!
$ferrari = new Auto(); //Dit wordt mijn Ferrari, omdat de variabele naam anders is dan die van de BMW, zullen ze elkaar niet lastig vallen!
$ferrari->merk = ‘Ferrari’;
$ferrari->kleur = ‘rood’ ;
$ferrari->nummerbord = ‘PH-PO-OP’;
echo $ferrari->merk . ‘ ‘; //Ferrari
echo $ferrari->kleur . ‘’; //rood
echo $ferrari->nummerbord . ‘

‘; //PH-PO-OP
echo $bmw->merk . ‘

‘ ; //onbekend
$bmw->merk = ‘BMW’;
echo $bmw->merk; //BMW
echo ‘

‘;
//En nu de methods (ik gebruik ff alleen ferrari)
$ferrari->geefGas();
$ferrari->geefMinderGas();
$ferrari->geefGas(100);
$ferrari->geefMinderGas(10);
$ferrari->geefGas(47);
$ferrari->geefMinderGas(38); //snelheid wordt nu 99 als ik me niet vergis..
$ferrari->handrem();

$rand = rand(5, 15);
for($i = 0; $i < $rand; $i++)
{
$ferrari->switchLichten();
}

echo ($ferrari->switchLichten()) ? ‘Aan’ : ‘Uit’;
?>
[/code]

Dat is stoer! Het is alleen wel een beetje omslachtig om op deze manier de eigenschappen te moeten aangeven!

Er zijn ook nog speciale methods, deze beginnen met twee liggende streepjes __ . één daarvan is de constructor. Als we deze toevoegen aan onze klasse, dan komt hij er zo uit te zien:

[code lang="php"] class Auto
{
public $merk = ‘onbekend';
public $kleur = ‘onbekend';
public $nummerbord = ‘on-be-kend';
protected $snelheid = 0;
protected $lichten = false; //lichten standaard uit

public function __construct($merk, $kleur, $nummerbord)
{
$this->merk = $merk;
$this->kleur = $kleur;
$this->nummerbord = $nummerbord;

$this->lichten = rand(0, 1);
}

public function geefGas($snelheid = 5)
{
$this->snelheid += $snelheid; //Let op dat je hier niet in de war raakt!

echo ‘Vroem!’; //normaal echo je niet in een method, maar anders wordt het wel erg omslachtig!
}

public function geefMinderGas($snelheid = 5)
{
$this->snelheid -= $snelheid; //natuurlijk kun je dit ook bereiken met de vorige method, bij een snelheid van -5 ;)

echo ‘Pfffff!’;
}

public function handrem()
{
$snelheid = $this->snelheid; //de oude snelheid bewaren

$this->snelheid = 0;

echo ‘IIIIIIIEEEEEEEE!’;

$this->botsing($snelheid); //roep een andere method aan
}

public function switchLichten()
{
$this->lichten = !$this->lichten;

return $this->lichten;
}

private function botsing($beginsnelheid)
{
if(!rand(0, 9) || $beginsnelheid > 100 || $beginsnelheid < -100)
{
echo ‘BOEM!';
}
}
}
?>[/code]

Dit kunnen we nu gebruiken om op een snelle manier eigenschappen aan een instantie mee te geven! Omdat het geen normale method is, kun je wel verwachten dat je hem ook niet zo aanroept! De construct method wordt aangeroepen als een nieuwe instantie van de klasse wordt gemaakt:

[code lang="php"] $bmw = new Auto(‘BMW', ‘Pimpel paars met zilveren sterretjes', ‘OO-PP-HP'); //Dit wordt mijn BMW!
$ferrari = new Auto(‘Ferrari', ‘rood', ‘PH-PO-OP'); //Dit wordt mijn Ferrari, omdat de variabele naam anders is dan die van de BMW, zullen ze elkaar niet lastig vallen!

echo $ferrari->merk . ‘ ‘; //Ferrari
echo $ferrari->kleur . ‘’; //rood
echo $ferrari->nummerbord . ‘

‘; //PH-PO-OP

echo $bmw->merk; //BMW

echo ‘

‘;

//En nu de methods (ik gebruik ff alleen ferrari)
$ferrari->geefGas();
$ferrari->geefMinderGas();
$ferrari->geefGas(100);
$ferrari->geefMinderGas(10);
$ferrari->geefGas(47);
$ferrari->geefMinderGas(38); //snelheid wordt nu 99 als ik me niet vergis..
$ferrari->handrem();

$rand = rand(5, 15);
for($i = 0; $i < $rand; $i++)
{
$ferrari->switchLichten();
}

echo ($ferrari->switchLichten()) ? ‘Aan’ : ‘Uit’;
?>[/code]

Zo dat maakt je code weer lekker een stuk korter!

Bedankt! Nu snap ik het!

Graag gedaan! Tip: zorg dat je alles wat hier boven staat goed snapt en ga dan zelf experimenteren. En reacties, commentaar, opmerkingen, aanmerkingen, verbeteringen, enz. zijn natuurlijk altijd welkom :)

Stem of voeg toe aanUitleg over het gebruik van deze icons :  Plaatsen/stemmen op NUjij Plaatsen/stemmen op eKudos Plaatsen/stemmen op Bligg.be Plaatsen/stemmen op Netjes.be Plaatsen/stemmen op Digg Voeg dit artikel toe aan Del.icio.us Voeg toe aan je favorieten op Technorati Abonneer je op de RSS-feed van deze site Verstuur deze pagina per e-mail via Feedburner Plaats dit bericht op Twitter

Gerelateerde berichten