Object georiënteerd programmeren
In de voorgaande hoofdstukken heb je alles kunnen lezen over de denkwijze die schuil gaat achter OOP. Nu is het tijd om die denkwijze uitdrukking te geven in PHP code. Voordat we daadwerkelijk beginnen, wil ik nog even je geheugen opfrissen met drie eerder genoemde conventies van OOP:
- Objecten definieer je in een class
- Eigenschappen definieer je als variabelen (properties) bovenaan je class
- Gedrag/veranderingen/manipulatie van eigenschappen definieer je als functies (methods) in je class
Aan de slag
Laten we snel bekijken hoe dat eruit ziet als we deze regels stap voor stap implementeren. In dit voorbeeld zullen we de basis van een eenvoudige User class opzetten.
De volgende stap is het definiëren van de properties van de User class. Een eigenschap die iedere User heeft, is een gebruikersnaam.
Het enige dat nu nog ontbreekt is een method om de gebruikersnaam te wijzigen en een method om die gebruikersnaam op te vragen.
In onderstaand voorbeeld maak ik gebruik van een set-method, iets dat ik later in deze handleiding weer naar de prullenbak zal verwijzen omdat er een veel mooiere manier voor is. Echter gebruik ik hem in dit voorbeeld toch om e.e.a. duidelijk te maken.
We zien twee nieuwe methods in de class en aan de namen valt direct af te leiden wat ze precies doen. Met deze laatste toevoeging is onze eerste class al bruikbaar!
$this
In het laatste voorbeeld komen we twee keer de variabele $this tegen. Dit is een speciale variabele die altijd verwijst naar het huidige object of in andere woorden, $this is een speciale 'self-referencing' variabele. We kunnen $this gebruiken om properties en methods van de huidige klasse te benaderen.
De setUsername() method kent de waarde van $name toe aan de property $username. En in de method getUsername() wordt de waarde van property $username teruggegeven.
In het begin kan de werking van $this soms verwarrend zijn, beschouw het in dat geval maar als een speicale OO PHP variabele waarmee PHP weet wat er moet gebeuren. In de loop van deze handleiding raak je vanzelf vertrouwd met de werking en weet ook jij precies wat er gebeurt.
Een bruikbare class, en nu?
Ik vertelde al dat we nu een bruikbare User class hebben. Het volgende voorbeeld laat zien hoe je van deze User class een User object maakt en hoe je vervolgens met het User object kunt werken.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
De output van dit scriptje ziet er als volgt uit:
Het eerste deel van dit scriptje komt bekend voor, dat is de User class die we eerder gemaakt hebben. Over de procedurele code daaronder, moet nog het een en ander gezegd worden.
Op de eerste regel wordt het User object aangemaakt. Beter gezegd: er wordt een instantie van de User class aangemaakt of de User class wordt geïnstantieerd. Die instantie is vervolgens het User object waar je verder mee werkt. Het User object is toegekend aan de variabele $user, hetgeen betekent dat we vanaf nu met $user deze instantie van de User class kunnen benaderen.
Op de regels daarna wordt achtereenvolgens de gebruikersnaam 'jan' aan het User object toegekend en de gebruikersnaam opgevraagd en geëchoed.
Meerdere instanties van een class
Zoals je wellicht al vermoedde is het mogelijk om meerdere instanties van een bepaalde class aan te maken. Sterker nog, het is zelfs vrij normaal dat dit gebeurt. Denk bijvoorbeeld aan een gastenboek waarin allemaal berichten staan. Elk bericht is dan een instantie van de Message class.
In het geval van onze User class werkt het precies hetzelfde. Er zijn genoeg situaties waarbij je twee of meer User objecten nodig hebt binnen een script. Dat ziet er als volgt uit.
Merk op dat ik hier de code van de User class zelf weggelaten heb, dit is enkel de procedurele code. Uiteraard heb je de code van de User class wel nodig voor een werkend script.
2
3
4
5
6
7
8
9
$jan = new User();
$jan->setUsername('jan');
$inge = new User();
$inge->setUsername('inge');
echo 'Dit script kent twee gebruikers: '.$jan->getUsername().' en '.$inge->getUsername().'.';
?>
We zien nu twee verschillende variabelen ($jan en $inge) die verwijzen naar twee verschillende User objecten. Ook zien we dat aan verschillende objecten verschillende waarden toegekend kunnen worden, terwijl deze verschillende objecten gebasseerd zijn op dezelfde class.
Tot zover dit eerste hoofdstuk over het echte programmeer werk. Tot nu toe hebben we het volgende gedaan:
- Een User class ontworpen
- Verschillende objecten gebasseerd op die class aangemaakt
- Waarden toegekend op opgevraagd van die objecten
- Meerdere objecten binnen een script gebruikt
Voor een eerste hoofdstuk is dit voldoende stof. In de volgende hoofdstukken zal ik verder ingaan op de opbouw van je PHP classes en de mogelijkheden die je hebt.
Inhoudsopgave
- Inleiding
- Object geörienteerd denken
- Foute denkwijze
- Object georiënteerd programmeren
- Visibility
- Naamgeving
- Constructor __construct()
- Voorbeeld: HTML tabel
- Inheritance
- Static methods en properties
- Abstract classes en Interfaces
- Slotwoord en referenties