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.
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.
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.
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.
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]
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.
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]
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.
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]
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]
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]
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!
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 :)
Einde van het jaar is vooruitkijken:
Total Voters: 7
14 reacties for "PHP OOP - wat en hoe?"
Dit legt alleen maar uit wat OOP is en wat classen zijn hé, het verteld niks over hoe je de classen onderverdeeld, wanneer je een nieuwe classe aanmaakt of iets toevoegt aan een oude. Ook extenden van classen wordt nergens behandeld wat soms toch best handig zou kunnen zijn.
Desalniettemin is het leuk uitgelegd en verteld het mooi hoe classen binnen PHP werken :)
@Derk:
Ik denk dat het verstandig is om een vervolg post te maken waarin je dieper ingaat op het toepassen van objecten/classes.
Deze tutorial legt heel mooi de beginselen uit van wat je met een object kunt, en dat het bedoelt is om een set van variabelen en functies die relevant voor elkaar zijn te koppelen in 1 object.
@libia:
Een vervolg post waarin je dus bovenstaande kwesties behandelt zou dus wel mooi zijn.
dit klopt, ik heb het inderdaad voor beginners geschreven en dan zijn zulk soort dingen nog niet heel boeiend, maar ik ga nog wel een vervolg post schrijven ja!
en trouwens: de tabs en haakjes () zijn een beetje weggevallen/verneukt, we zijn al bezig met het zoeken naar een oplossing ;)
@Derk/Libia een vervolgpost hierop is zeer welkom hoor. :)
ik kan hem niet meer bewerken, maar misschien kun je een “samenvatting” toevoegen (de hele post staat nu namelijk op de startpagina :S)
Done.
bedankt :P
Je mag PHP OOP ook afkorten tot POOP hè.
@ElbertF, hmm.. vaag klinkt dat wel bekent ja…
maar de meeste mensen noemen het ook gewoon OOP :)
Het was een grapje. :/
ooh.. :P maar volgensmij zijn er wel mensen die dat gebruiken! :P
Ik heb het wel eens gehoort ja
[...] kennis hebt van hoe object georienteerd programmeren in php werkt. Zo niet is het handig om eerst dit artikel aandachtig door te [...]
[...] hoop dat je genoten hebt van m’n eerste deel en dat je hier lekker mee hebt kunnen oefenen en experimenteren! Het is heel erg belangrijk dat je [...]
Leuk! Plaats een bericht: