U bevindt zich hier: Forum » Tutorials » [PHP] Object georienteerd
   Actief Topic: [PHP] Object georienteerd

Vorige ( 1 ) Volgende

vlerknozem
Admin
avatar
# Gepost op 03-01-2010 17:50
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:

  1. Object
  2.  |
  3.  +----- Var 1
  4.  |
  5.  +----- Method 1
  6.  |
  7.  +----- 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.

Plain | Plain new window | PHP code:
  1. <?php
  2. class fruit {
  3.     var $fruit = 'appel';
  4.  
  5.     function doe_iets() {
  6.         return 'Ik vind een '. $this->fruit .' lekker';
  7.     }
  8. }
  9.  
  10. $fruit = new fruit();
  11. echo $fruit->doe_iets(); // Ik vind een appel lekker
  12. $fruit->fruit = 'peer';
  13. echo $fruit->doe_iets(); // Ik vind een peer lekker
  14. ?>


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:
Plain | Plain new window | PHP code:
  1. <?php
  2. class test {
  3.     function __construct() {
  4.         echo 'test';
  5.     }
  6. }
  7. $test = new test(); // test wordt geechoed
  8. ?>


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:
Plain | Plain new window | PHP code:
  1. <?php
  2. class a {
  3.     var $test = 'hallo';
  4. }
  5.  
  6. class b extends a {
  7.     function b () {
  8.         echo $this->test;
  9.     }
  10. }
  11. $test = new b(); // hallo
  12. ?>


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.

Plain | Plain new window | PHP code:
  1. <?php
  2. class a {
  3.     var $test;
  4. }
  5. ?>


Ook is het mogelijk om in een keer meerdere variabele aan te maken.

Plain | Plain new window | PHP code:
  1. <?php
  2. class a {
  3.     var $test, $test2, $test3;
  4. }
  5. ?>


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.

Plain | Plain new window | PHP code:
  1. <?php
  2. class a {
  3.     private $prive = 'a';
  4.     protected $beschermd = 'b';
  5.     public $publiek = 'c';
  6. }
  7.  
  8. $test = new a();
  9. echo $test->prive;
  10. ?>


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.

Plain | Plain new window | PHP code:
  1. <?php
  2. class a {
  3.     private $prive = 'a';
  4.     protected $beschermd = 'b';
  5.     public $publiek = 'c';
  6. }
  7.  
  8. class b extends a {
  9.     function b () {
  10.         echo $this->prive;
  11.         echo $this->beschermd;
  12.         echo $this->publiek;
  13.     }
  14. }
  15. $test = new b(); // bc
  16. ?>


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:

Plain | Plain new window | PHP code:
  1. <?php
  2. class a {
  3.     static public $b = 'test';
  4.     public $c = 'hallo';   
  5.    
  6.     public function test() {
  7.         return self::$b;
  8.     }
  9. }
  10.  
  11.  
  12. echo a::test(); // test
  13. echo a::$b; // test
  14. echo a::$c; // werkt niet omdat $c niet static is.
  15. ?>

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

Ricardo
member
avatar
# Gepost op 03-01-2010 18:01


Zo-ie-zo al +1 voor de tutorial schrijven (moeite)![[party]]

Ik ga zo ff dit doornemen, bedankt!
Namens vele mensen (denk ik):P

Groeten,
Ricardo

superkluns
Tester
avatar
# Gepost op 04-01-2010 19:00


Citaat van ricardof
Namens vele mensen (denk ik):P

en hier is er eentje die onderdeel is van die 'vele mensen':P:P

vlerknozem
Admin
avatar
# Gepost op 09-01-2010 21:41


Hehe niet zo slijmen he heren[[party]]

Lees de forum regels

superkluns
Tester
avatar
# Gepost op 10-01-2010 14:03
Bewerkt door superkluns op 10-01-2010 14:07


[offtopic]@vlerk, als je je forum-onderschrift bij je bericht betrekt, lijkt het net alsof we in overtreding zijn:P:P[/offtopic]

ontopic:
ik snap het nut van 'static' eigenlijk niet helemaal.
Het enige is dat de schrijfwijze veranderd van
Plain | Plain new window | PHP code:
  1. $class->var
naar
Plain | Plain new window | PHP code:
  1. class::$var

vlerknozem
Admin
avatar
# Gepost op 10-01-2010 16:27


Citaat van superkluns
[offtopic]@vlerk, als je je forum-onderschrift bij je bericht betrekt, lijkt het net alsof we in overtreding zijn:P:P[/offtopic]

Lol. Moet het verschil tussen bericht en onderschrift een keertje verduidelijken.

Zie de twee codes:
Plain | Plain new window | PHP code:
  1. <?php
  2. $class = new classnaam();
  3. $class->var = 'blaat';
  4. echo $class->var; // blaat
  5.  
  6. $class = new classnaam();
  7. echo $class->var; // Deze var is niet gedefined.
  8. ?>


Plain | Plain new window | PHP code:
  1. <?php
  2. classnaam::$var = 'blaat';
  3. echo classnaam::$var;
  4. ?>

Bij de eerste code heb je steeds new classnaam(); nodig voor de class te activeren. Alles wat je doet buiten die class zoals een variabele zetten, heb je niet meer als je die class ergens anders weer aanmaakt. Bij de tweede code kan je overal classnaam::$var aamroepen en krijg je in dit geval 'blaat'.

Is dus handig als je met meerdere klasses werkt.

Lees de forum regels

superkluns
Tester
avatar
# Gepost op 10-01-2010 21:53
Bewerkt door superkluns op 10-01-2010 21:53


aha, dus wat ik zeg klopt eigenlijk helemaal niet:P
ik zeg namelijk dit:
Plain | Plain new window | PHP code:
  1. echo $class->var;
en het moet zijn:
Plain | Plain new window | PHP code:
  1. $iets = new class();
  2. echo $iets->var;

dan snap ik de handigheid wel:P
tnx

vlerknozem
Admin
avatar
# Gepost op 11-01-2010 19:29


Hehe, als je $class-var gebruikt zonder dat $class gedeclareerd is en wel met new classnaam() dan krijg je een fout.

Lees de forum regels

Vorige ( 1 ) Volgende

U moet aangemeld zijn om een reactie te kunnen plaatsen.

Indien u nog geen account heeft kunt u zich hier registreren.



© copyright 2009/2010 WebProjects 1.02 - Template van Sebastaan Franken