Webmasterplein Blog

met passie voor het web

Archive for the ‘Scripten’ Category

PHP OOP - wat en hoe?

dinsdag
Nov 18,2008

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):

  1. <?php<br />
  2. class Auto<br />
  3. {<br />
  4. }<br />
  5. ?>

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:

  1. <?php<br />
  2. $bmw = new Auto(); //Dit wordt mijn BMW!<br />
  3. $ferrari = new Auto(); //Dit wordt mijn Ferrari, omdat de variabele naam anders is dan die van de BMW, zullen ze elkaar niet lastig vallen!<br />
  4. ?>

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:

  1. <?php<br />
  2. [type] $[naam]; //variabele zonder waarde<br />
  3. [type] $[naam] = [waarde]; //variabele met waarde<br />
  4. ?>

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:

  1. <?php<br />
  2. class Auto<br />
  3. {<br />
  4. public $merk = ‘onbekend’;<br />
  5. public $kleur = ‘onbekend‘;<br />
  6. public $nummerbord = ‘on-be-kend‘;<br />
  7. protected $snelheid = 0;<br />
  8. protected $lichten = false; //lichten standaard uit<br />
  9. }<br />
  10. ?>

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:

  1. <?php<br />
  2. $bmw = new Auto(); //Dit wordt mijn BMW!<br />
  3. $ferrari = new Auto(); //Dit wordt mijn Ferrari, omdat de variabele naam anders is dan die van de BMW, zullen ze elkaar niet lastig vallen!</p>
  4. <p>$ferrari->merk = ‘Ferrari‘;<br />
  5. $ferrari->kleur = ‘rood’ ;<br />
  6. $ferrari->nummerbord = ‘PH-PO-OP‘;</p>
  7. <p>echo $ferrari->merk . ‘ <br />’; //Ferrari<br />
  8. echo $ferrari->kleur . ‘<br />‘; //rood<br />
  9. echo $ferrari->nummerbord . ‘</p>
  10. <p>’; //PH-PO-OP</p>
  11. <p>echo $bmw->merk . ‘</p>
  12. <p>‘ ; //onbekend</p>
  13. <p>$bmw->merk = ‘BMW’;</p>
  14. <p>echo $bmw->merk; //BMW<br />
  15. ?>

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:

  1. <?php<br />
  2. [type] function [naam]([parameters])<br />
  3. {<br />
  4. }<br />
  5. ?>

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

  1. <?php<br />
  2. class Auto<br />
  3. {<br />
  4. public $merk = ‘onbekend‘;<br />
  5. public $kleur = ‘onbekend’;<br />
  6. public $nummerbord = ‘on-be-kend‘;<br />
  7. protected $snelheid = 0;<br />
  8. protected $lichten = false; //lichten standaard uit</p>
  9. <p>public function geefGas($snelheid = 5)<br />
  10. {<br />
  11. $this->snelheid += $snelheid; //Let op dat je hier niet in de war raakt!</p>
  12. <p>echo ‘Vroem!<br />’; //normaal echo je niet in een method, maar anders wordt het wel erg omslachtig!<br />
  13. }</p>
  14. <p>public function geefMinderGas($snelheid = 5)<br />
  15. {<br />
  16. $this->snelheid -= $snelheid; //natuurlijk kun je dit ook bereiken met de vorige method, bij een snelheid van -5 ;)</p>
  17. <p>echo ‘Pfffff!<br />‘;<br />
  18. }</p>
  19. <p>public function handrem()<br />
  20. {<br />
  21. $snelheid = $this->snelheid; //de oude snelheid bewaren</p>
  22. <p>$this->snelheid = 0;</p>
  23. <p>echo ‘IIIIIIIEEEEEEEE!<br />’;</p>
  24. <p>$this->botsing($snelheid); //roep een andere method aan<br />
  25. }</p>
  26. <p>public function switchLichten()<br />
  27. {<br />
  28. $this->lichten = !$this->lichten;</p>
  29. <p>return $this->lichten;<br />
  30. }</p>
  31. <p>private function botsing($beginsnelheid)<br />
  32. {<br />
  33. if(!rand(0, 9) || $beginsnelheid > 100 || $beginsnelheid < -100)<br />
  34. {<br />
  35. echo ‘BOEM!<br />‘;<br />
  36. }<br />
  37. }<br />
  38. }<br />
  39. ?>

Hoe gebruik ik deze methods?

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

  1. <br />
  2. <?php<br />
  3. $bmw = new Auto(); //Dit wordt mijn BMW!<br />
  4. $ferrari = new Auto(); //Dit wordt mijn Ferrari, omdat de variabele naam anders is dan die van de BMW, zullen ze elkaar niet lastig vallen!<br />
  5. $ferrari->merk = ‘Ferrari’;<br />
  6. $ferrari->kleur = ‘rood‘ ;<br />
  7. $ferrari->nummerbord = ‘PH-PO-OP’;<br />
  8. echo $ferrari->merk . ‘ <br />‘; //Ferrari<br />
  9. echo $ferrari->kleur . ‘<br />’; //rood<br />
  10. echo $ferrari->nummerbord . ‘</p>
  11. <p>‘; //PH-PO-OP<br />
  12. echo $bmw->merk . ‘</p>
  13. <p>’ ; //onbekend<br />
  14. $bmw->merk = ‘BMW‘;<br />
  15. echo $bmw->merk; //BMW<br />
  16. echo ‘</p>
  17. <p>’;<br />
  18. //En nu de methods (ik gebruik ff alleen ferrari)<br />
  19. $ferrari->geefGas();<br />
  20. $ferrari->geefMinderGas();<br />
  21. $ferrari->geefGas(100);<br />
  22. $ferrari->geefMinderGas(10);<br />
  23. $ferrari->geefGas(47);<br />
  24. $ferrari->geefMinderGas(38); //snelheid wordt nu 99 als ik me niet vergis..<br />
  25. $ferrari->handrem();</p>
  26. <p>$rand = rand(5, 15);<br />
  27. for($i  = 0; $i < $rand; $i++)<br />
  28. {<br />
  29. $ferrari->switchLichten();<br />
  30. }</p>
  31. <p>echo ($ferrari->switchLichten()) ? ‘Aan‘ : ‘Uit’;<br />
  32. ?><br />

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:

  1. <?php<br />
  2. class Auto<br />
  3. {<br />
  4.         public $merk = ‘onbekend‘;<br />
  5.         public $kleur = ‘onbekend’;<br />
  6.         public $nummerbord = ‘on-be-kend‘;<br />
  7.         protected $snelheid = 0;<br />
  8.         protected $lichten = false; //lichten standaard uit</p>
  9. <p>     public function __construct($merk, $kleur, $nummerbord)<br />
  10.         {<br />
  11.                 $this->merk = $merk;<br />
  12.                 $this->kleur = $kleur;<br />
  13.                 $this->nummerbord = $nummerbord;</p>
  14. <p>          $this->lichten = rand(0, 1);<br />
  15.         }</p>
  16. <p>     public function geefGas($snelheid = 5)<br />
  17.         {<br />
  18.                 $this->snelheid += $snelheid; //Let op dat je hier niet in de war raakt!</p>
  19. <p>          echo ‘Vroem!<br />’; //normaal echo je niet in een method, maar anders wordt het wel erg omslachtig!<br />
  20.         }</p>
  21. <p>     public function geefMinderGas($snelheid = 5)<br />
  22.         {<br />
  23.                 $this->snelheid -= $snelheid; //natuurlijk kun je dit ook bereiken met de vorige method, bij een snelheid van -5 ;)</p>
  24. <p>          echo ‘Pfffff!<br />‘;<br />
  25.         }</p>
  26. <p>     public function handrem()<br />
  27.         {<br />
  28.                 $snelheid = $this->snelheid; //de oude snelheid bewaren</p>
  29. <p>          $this->snelheid = 0;</p>
  30. <p>          echo ‘IIIIIIIEEEEEEEE!<br />’;</p>
  31. <p>          $this->botsing($snelheid); //roep een andere method aan<br />
  32.         }</p>
  33. <p>     public function switchLichten()<br />
  34.         {<br />
  35.                 $this->lichten = !$this->lichten;</p>
  36. <p>          return $this->lichten;<br />
  37.         }</p>
  38. <p>     private function botsing($beginsnelheid)<br />
  39.         {<br />
  40.                 if(!rand(0, 9) || $beginsnelheid > 100 || $beginsnelheid < -100)<br />
  41.                 {<br />
  42.                         echo ‘BOEM!<br />‘;<br />
  43.                 }<br />
  44.         }<br />
  45. }<br />
  46. ?>

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:

  1. <?php<br />
  2. $bmw = new Auto(‘BMW‘, ‘Pimpel paars met zilveren sterretjes’, ‘OO-PP-HP‘); //Dit wordt mijn BMW!<br />
  3. $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!</p>
  4. <p>echo $ferrari->merk . ‘ <br />‘; //Ferrari<br />
  5. echo $ferrari->kleur . ‘<br />’; //rood<br />
  6. echo $ferrari->nummerbord . ‘</p>
  7. <p>‘; //PH-PO-OP</p>
  8. <p>echo $bmw->merk; //BMW</p>
  9. <p>echo ‘</p>
  10. <p>’;</p>
  11. <p>//En nu de methods (ik gebruik ff alleen ferrari)<br />
  12. $ferrari->geefGas();<br />
  13. $ferrari->geefMinderGas();<br />
  14. $ferrari->geefGas(100);<br />
  15. $ferrari->geefMinderGas(10);<br />
  16. $ferrari->geefGas(47);<br />
  17. $ferrari->geefMinderGas(38); //snelheid wordt nu 99 als ik me niet vergis..<br />
  18. $ferrari->handrem();</p>
  19. <p>$rand = rand(5, 15);<br />
  20. for($i  = 0; $i < $rand; $i++)<br />
  21. {<br />
  22.         $ferrari->switchLichten();<br />
  23. }</p>
  24. <p>echo ($ferrari->switchLichten()) ? ‘Aan‘ : ‘Uit’;<br />
  25. ?>

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 :)

Single-Quotes VS. Double-Quotes

dinsdag
Okt 21,2008

Iedereen die begint met programmeren komt regelmatig single-quotes en double-quotes tegen. En weet vaak niet het verschil, betekent het wat anders? Doet het wat anders? Of is het ene makkelijker dan het andere. In dit blog artikeltje probeer ik hier iets meer uitleg over te geven.

(more…)

woensdag
Okt 15,2008

Voor die gene die niet weten wat Silverlight is: het is de concurent van de Flash-player en is net als de Flash-player een plug-in voor browsers. Microsoft heeft gister zijn tweede versie van Silverlight geïntroduceerd. Microsoft Silverlight 2 is de opvolger van versie 1 en heeft vele veranderingen ondergaan, waaronder meer mogelijkheden tot het schrijven van Silverlight applicaties.

Ondersteuing van .Net-framework, een deepzoom feature, advertentie weergave en betere beveiligde drm (Digital Rights Management) zijn nieuwe toevoegingen voor de nieuwe versie van Silverlight. Ook de GUI-objecten (Graphical User Interface) uit Silverlight hebben een grote verandering ondergaan, hierdoor is de applicatie overzichtelijker geworden, zowel voor de programmeur als voor de beginner in Silverlight.

Door de ondersteuning van .Net-framework is in Silverlight nu mogelijk om applicaties te maken in C#, Javascript, IronPython en IronRuby.

Silverlight 2 is downloaden op de site van Microsoft Silverlight. Huidige installaties van Silverlight worden automatisch geüpdate.

woensdag
Okt 15,2008

Vandaag heeft Adobe een nieuwe versie van zijn reeks Flash Players uitgegeven, wel te verstaan onder de naam Flash Player 10. Adobe heeft zelf veel gedaan voor het aanspreken van de GPU (Graphics processing unit), dit is dan ook wel nodig met de 3D-applicaties die zeer gemakkelijk gemaakt kunnen worden voor deze nieuwe Flash Player.

De grootste verbetering van het programma is dus het ’showen’ van 3D-objecten in een flash-animatie. In de eerder deze maand uitgebrachte Adobe Flash CS4 is een tool gebouwd om gemakkelijk 2D-objecten te converteren naar 3D-objecten. De nieuwe tool in het programma is de ‘authoringtool’ en kan ingezet worden op elk figuur, zowel op tekst als op een graphic.

De layout van tekst kan in Flash CS4 verbeterd worden dankzij de nieuwe Flash Player. Zo kan de tekst meerdere opmaken krijgen en je kan per Frame deze opmaak ook werkelijk veranderen. Shadow en Glow zijn nieuwe onderdelen die tijdens het afspelen van de tekst-animatie blijven bestaan, maar hierdoor krijgt de GPU het soms wel moeilijk. Daarom is het bij het maken van dit soort animaties handig om de GPU aan te spreken op zijn gedrag en eventueel een andere versnelling van de GPU in te stellen.

Ook wat totaal niet mocht ontbreken in de nieuwe Flash Player is het animeren van HD-kwaliteit video’s, waarbij de gemiddelde HD-kwaliteit ligt op h.264 formaat. Hierdoor zullen animaties en applicaties nog mooier worden dan in de Flash Player 9 formaat. Flash Player 9 had soms in de applicaties nog moeite met oudere versies van Flash maar dat is met versie 10 helemaal verhopen. De compabiliteit van versie 10 is erg verbeterd ten opzichte van versie 9.

Flash Player 10 is beschikbaar voor Windows, MacOS x en Linux en is te downloaden op de website van Adobe Flash Player. Op die website zie je meteen ook al een klein voorproefje van de toekomst van de flash-animaties.

Afgelopen week werd Silverlight 2 ook al uitgebracht door Microsoft en bezit ook vele extra’s. Probeer zelf uit te vinden welke player jij het beste vind werken!

woensdag
Sep 24,2008

In een bericht op Google’s Webmasters Blog werd gisteren duidelijkheid gegeven over hoe de populaire zoekmachine nu omgaat met dynamische URL’s. Opvallend in deze blogpost was voornamelijk het feit dat Google de dynamische URL aanbeveelt boven de statische URL.

Op internet doemde al jaren het idee dat Google moeite heeft met dynamische URL’s, hoewel Google indirect toegeeft dat dit in het verleden ook zo was, is dit nu verleden tijd en schrijft men:

We can crawl dynamic URLs and interpret the different parameters. We might have problems crawling and ranking your dynamic URLs if you try to make your urls look static and in the process hide parameters which offer the Googlebot valuable information. One recommendation is to avoid reformatting a dynamic URL to make it look static. It’s always advisable to use static content with static URLs as much as possible, but in cases where you decide to use dynamic content, you should give us the possibility to analyze your URL structure and not remove information by hiding parameters and making them look static.

Het populaire mod_rewriting is volgens Google niet de juiste keuze om content duidelijk weer te geven, liever hebben ze de dynamische URL zodat Google zelf de informatie er uit pikt die het wil hebben. Bang dat de webmaster enkele handige informatie voor de zoekmachine achterhoud.

Op de weblog van Google Webmaster Central heeft het in ieder geval geleid voor flink wat discussie.