# Gepost op 03-01-2010 17:50
Bewerkt door vlerknozem op 03-01-2010 17:59
Bewerkt door vlerknozem op 03-01-2010 17:59
In deze tutorial wil ik de basis van OOP gaan uitleggen in PHP. OOP staat voor Object Oriented Programming. In het Nederlands betekend dit Object Georienteerd Programmeren. Dit wil zeggen dat je alles benaderd vanaf objecten. Een object noemen we ook wel een klasse. Een klasse wordt weer onderverdeeld in methods. Een method is eigenlijk exact hetzelfde als een gewone functie, echter is dit een onderdeel van de klasse.
Een klasse kan je voorstellen als dit:
Wat is nu het nut van OOP?
Er zijn meerdere voordelen. Als je een method in een klasse nou eens vergelijkt met een gewone PHP functie. Een normale functie heeft een ingang, en een uitgang. Daar waar je de functie aanroept moet je dus ook meteen de variabelen doorgeven, en de return waarde van de functie bijvoorbeeld in een variabele zetten. Bij OOP kan je variabelen in de klasse declareren en vervolgens in elke method gebruiken. Buiten dit verhaal maakt het je code veel overzichtelijker.
Een klasse maken
We gaan nu even een simpele klasse aanmaken.
Deze code zegt eigenlijk al redelijk veel. Met 'class' maak je een nieuwe klasse aan. De naam van de klasse is 'fruit'. In deze klasse maak je een variabele genaamd 'fruit', en deze geef je de waarde 'appel' mee. Ook maak je in deze klasse de functie 'doe_iets' aan. Deze functie, of eigenlijk method, geeft een return waarde mee.
Zoals je ziet gebruik ik '$this->' in de method doe_iets. Met deze variabele $this benader je de klasse waarin je deze variabele aanroept. De tekens '->' gebruik je om het object (de klasse) apart te houden van de variabele of method.
Als je de klasse wil benaderen vanaf buitenaf moet je de klasse eerst aanroepen. Dit doe je met '$var_naam = new klasse_naam();'. Nu kan je de variabele '$var_naam' (in het voorbeeld $fruit) gebruiken zoals je $this gebruikt in de klasse.
Contruct method
Er is een method die speciaal is bedoeld om te draaien wanneer de klasse wordt aangeroepen. Om deze uitleg duidelijk te maken, hier een voorbeeld:
Zoals je ziet wordt de method met de naam '__construct' direct aangeroepen als je 'new test()' uitvoert. Overigens raad ik een echo binnen de klasse af, in dit voorbeeld doe ik het alleen om het duidelijk te houden. Een handigheidje, als je de method naam '__construct' vervangt door de klassenaam (in dit geval 'test'), dan krijg je hetzelfde effect.
Twee klasses samenvoegen
Het is mogelijk om bij een klasse een andere klasse te gebruiken. Dus alsof beide klasses slechts een klasse is. Een voorbeeld:
In klasse a declareer je een variabele 'test'. Deze roep je in klasse b aan alsof het een variabele van klasse b is. Dit is mogelijk met 'extends'.
Variabelen
In het vorige stukje ging ik al een beetje in op variabelen. Maar nu even nog wat extra koek. De variabele declareer je in het begin van de klasse, buiten de functies. Het is niet perse nodig om de variabele te vullen, alleen declareren is ook mogelijk.
Ook is het mogelijk om in een keer meerdere variabele aan te maken.
In principe is het niet verplicht om variabele hier al te declareren, maar het is wel zo netjes. Let op dat het bij static wel nodig is. Daar kom ik later op terug.
Private, Protected en Public
Deze drie dingen zijn ervoor bedoeld om variabelen en functies (leden van de klasse) te beschermen. Met private bescherm je een lid tegen aanroepen van buitenaf, en tegen overerven. Met protected bescherm je een lid alleen tegen aanroepen van buitenaf. Met public is het lid volledig toegangkelijk.
Dit zal dus niet werken. Je krijgt een fatal error ondat de variabele 'prive' een private lid is. Het zelfde geldt voor de variabele 'beschermd'. Alleen 'publiek' kan je benanderen. Als we nu eens klasse a samen voegen met klasse b. Dus met 'extends'. Dan zie je het verschil tussen private en protected.
Je ziet nu alleen 'bc'. Private beschermd namelijk tegen overerven. Daarom kan je in klasse b ook geen private leden van klasse a aanroepen. Wat je misschien ook is opgevallen is dat public eigenlijk hetzelfde is als het standaard. Daarom hoef je public in principe niet te gebruiken, hoewel het voor sommige misschien de broncode wel overzichtelijker maakt.
Static
Harstijke leuk allemaal. Maar stel je hebt een klasse met een variabele die je steeds wilt gebruiken. Om nu overal de klasse met '$object = new klasse_naam()' aan te roepen is niet handig. Je zou daarom static kunnen gebruiken. De method 'test' van klasse 'a' roep je dan aan met 'a::test'. Gaat het om een variabele test dan gebruik je 'a::$test'. Wel moeten de betreffende variabele dan static zijn. Voorbeeld:
Zoals je nu ook ziet gebruik je in de klasse geen $this meer. Om een method aan te roepen gebruik je 'self::method_naam()', en om een variabele aan te roepen gebruik je 'self::$variabele_naam'. Ook zal je merken dat alles nu strenger is. Normaal kon je een variabele in bijvoorbeeld de method 'test' declareren. Nu moet die variabele in het begin van de klasse gedeclareerd worden als een static variabele.
Tot slot
Beetje teveel van het goede? Als je nog iets niet snapt kan je het altijd hier vragen. Dan probeer ik het beter uit te leggen. Wat slim is om te doen is om alle voorbeelden uit te proberen, en dan ook dingen veranderen en kijken wat er gebeurd. Ook is het handig om nog verder te zoeken naar andere voorbeelden. Bij de scripts staan nog een paar OOP scripts waar je eventueel nog naar kan kijken.
Natuurlijk is er nog veel meer in OOP, maar daar ga ik jullie nu niet mee opzadelen.
Een klasse kan je voorstellen als dit:
Plain | Plain new window | code:
- Object
- |
- +----- Var 1
- |
- +----- Method 1
- |
- +----- Method 2
Wat is nu het nut van OOP?
Er zijn meerdere voordelen. Als je een method in een klasse nou eens vergelijkt met een gewone PHP functie. Een normale functie heeft een ingang, en een uitgang. Daar waar je de functie aanroept moet je dus ook meteen de variabelen doorgeven, en de return waarde van de functie bijvoorbeeld in een variabele zetten. Bij OOP kan je variabelen in de klasse declareren en vervolgens in elke method gebruiken. Buiten dit verhaal maakt het je code veel overzichtelijker.
Een klasse maken
We gaan nu even een simpele klasse aanmaken.
- <?php
- class fruit {
- var $fruit = 'appel';
- function doe_iets() {
- return 'Ik vind een '. $this->fruit .' lekker';
- }
- }
- $fruit = new fruit();
- echo $fruit->doe_iets(); // Ik vind een appel lekker
- $fruit->fruit = 'peer';
- echo $fruit->doe_iets(); // Ik vind een peer lekker
- ?>
Deze code zegt eigenlijk al redelijk veel. Met 'class' maak je een nieuwe klasse aan. De naam van de klasse is 'fruit'. In deze klasse maak je een variabele genaamd 'fruit', en deze geef je de waarde 'appel' mee. Ook maak je in deze klasse de functie 'doe_iets' aan. Deze functie, of eigenlijk method, geeft een return waarde mee.
Zoals je ziet gebruik ik '$this->' in de method doe_iets. Met deze variabele $this benader je de klasse waarin je deze variabele aanroept. De tekens '->' gebruik je om het object (de klasse) apart te houden van de variabele of method.
Als je de klasse wil benaderen vanaf buitenaf moet je de klasse eerst aanroepen. Dit doe je met '$var_naam = new klasse_naam();'. Nu kan je de variabele '$var_naam' (in het voorbeeld $fruit) gebruiken zoals je $this gebruikt in de klasse.
Contruct method
Er is een method die speciaal is bedoeld om te draaien wanneer de klasse wordt aangeroepen. Om deze uitleg duidelijk te maken, hier een voorbeeld:
- <?php
- class test {
- function __construct() {
- echo 'test';
- }
- }
- $test = new test(); // test wordt geechoed
- ?>
Zoals je ziet wordt de method met de naam '__construct' direct aangeroepen als je 'new test()' uitvoert. Overigens raad ik een echo binnen de klasse af, in dit voorbeeld doe ik het alleen om het duidelijk te houden. Een handigheidje, als je de method naam '__construct' vervangt door de klassenaam (in dit geval 'test'), dan krijg je hetzelfde effect.
Twee klasses samenvoegen
Het is mogelijk om bij een klasse een andere klasse te gebruiken. Dus alsof beide klasses slechts een klasse is. Een voorbeeld:
- <?php
- class a {
- var $test = 'hallo';
- }
- class b extends a {
- function b () {
- echo $this->test;
- }
- }
- $test = new b(); // hallo
- ?>
In klasse a declareer je een variabele 'test'. Deze roep je in klasse b aan alsof het een variabele van klasse b is. Dit is mogelijk met 'extends'.
Variabelen
In het vorige stukje ging ik al een beetje in op variabelen. Maar nu even nog wat extra koek. De variabele declareer je in het begin van de klasse, buiten de functies. Het is niet perse nodig om de variabele te vullen, alleen declareren is ook mogelijk.
- <?php
- class a {
- var $test;
- }
- ?>
Ook is het mogelijk om in een keer meerdere variabele aan te maken.
- <?php
- class a {
- var $test, $test2, $test3;
- }
- ?>
In principe is het niet verplicht om variabele hier al te declareren, maar het is wel zo netjes. Let op dat het bij static wel nodig is. Daar kom ik later op terug.
Private, Protected en Public
Deze drie dingen zijn ervoor bedoeld om variabelen en functies (leden van de klasse) te beschermen. Met private bescherm je een lid tegen aanroepen van buitenaf, en tegen overerven. Met protected bescherm je een lid alleen tegen aanroepen van buitenaf. Met public is het lid volledig toegangkelijk.
- <?php
- class a {
- private $prive = 'a';
- protected $beschermd = 'b';
- public $publiek = 'c';
- }
- $test = new a();
- echo $test->prive;
- ?>
Dit zal dus niet werken. Je krijgt een fatal error ondat de variabele 'prive' een private lid is. Het zelfde geldt voor de variabele 'beschermd'. Alleen 'publiek' kan je benanderen. Als we nu eens klasse a samen voegen met klasse b. Dus met 'extends'. Dan zie je het verschil tussen private en protected.
- <?php
- class a {
- private $prive = 'a';
- protected $beschermd = 'b';
- public $publiek = 'c';
- }
- class b extends a {
- function b () {
- echo $this->prive;
- echo $this->beschermd;
- echo $this->publiek;
- }
- }
- $test = new b(); // bc
- ?>
Je ziet nu alleen 'bc'. Private beschermd namelijk tegen overerven. Daarom kan je in klasse b ook geen private leden van klasse a aanroepen. Wat je misschien ook is opgevallen is dat public eigenlijk hetzelfde is als het standaard. Daarom hoef je public in principe niet te gebruiken, hoewel het voor sommige misschien de broncode wel overzichtelijker maakt.
Static
Harstijke leuk allemaal. Maar stel je hebt een klasse met een variabele die je steeds wilt gebruiken. Om nu overal de klasse met '$object = new klasse_naam()' aan te roepen is niet handig. Je zou daarom static kunnen gebruiken. De method 'test' van klasse 'a' roep je dan aan met 'a::test'. Gaat het om een variabele test dan gebruik je 'a::$test'. Wel moeten de betreffende variabele dan static zijn. Voorbeeld:
- <?php
- class a {
- static public $b = 'test';
- public $c = 'hallo';
- public function test() {
- return self::$b;
- }
- }
- echo a::test(); // test
- echo a::$b; // test
- echo a::$c; // werkt niet omdat $c niet static is.
- ?>
Zoals je nu ook ziet gebruik je in de klasse geen $this meer. Om een method aan te roepen gebruik je 'self::method_naam()', en om een variabele aan te roepen gebruik je 'self::$variabele_naam'. Ook zal je merken dat alles nu strenger is. Normaal kon je een variabele in bijvoorbeeld de method 'test' declareren. Nu moet die variabele in het begin van de klasse gedeclareerd worden als een static variabele.
Tot slot
Beetje teveel van het goede? Als je nog iets niet snapt kan je het altijd hier vragen. Dan probeer ik het beter uit te leggen. Wat slim is om te doen is om alle voorbeelden uit te proberen, en dan ook dingen veranderen en kijken wat er gebeurd. Ook is het handig om nog verder te zoeken naar andere voorbeelden. Bij de scripts staan nog een paar OOP scripts waar je eventueel nog naar kan kijken.
Natuurlijk is er nog veel meer in OOP, maar daar ga ik jullie nu niet mee opzadelen.
Lees de forum regels
![[[party]]](/projects/plugins/ubb/smileys/smiley_party.gif)
