OOP Beginnershandleiding (PHP5)
- Inleiding
- Object geörienteerd denken
- Foute denkwijze
- Object georiënteerd programmeren
- Visibility
- Naamgeving
- Constructor __construct()
- Voorbeeld: HTML tabel
- Inheritance
- Voorbeeld: HTML tabel 2 (inheritance)
- Static methods en properties
- Abstract classes en Interfaces
- Magic methods
- Slotwoord en referenties
- Reacties op deze tutorial
Object geörienteerd denken
Object georiënteerd programmeren begint bij de denkwijze waarmee je een applicatie benadert. Als je nieuw bent in de wereld van OOP zul je merken dat deze denkwijze (en dus de manier van programmeren) wezenlijk verschilt van hetgeen je tot nu toe gewend was. Dit gedeelte van de handleiding heeft als doel om een besef te creëren van die achterliggende denkwijze en zal dan ook nog weinig regels code bevatten. Desalniettemin is het waarschijnlijk een van de belangrijkste onderdelen, die je als beginner zeker niet over moet slaan.Dit gedeelte van de handleiding is grotendeels gebaseerd op de bestaande handleiding 'Object georiënteerd denken' geschreven door Erik Duindam. Teksten en voorbeelden uit die handleiding, zul je hier letterlijk terugvinden. Het origineel is hier te vinden.
Besef wat objecten zijn
De definitie van OOP geeft het al aan: OOP is een methode die zich richt op objecten. Maar wat zijn objecten nu precies? Wat doen ze? En misschien wel het belangrijkste op dit moment, hoe kan je ze herkennen?
Kijk eens naar het leven. Alles bestaat uit 'dingen', zoals mensen, computers, bomen, water, de lucht, dieren, etc. Die 'dingen' zou je ook objecten kunnen noemen. Ik als mens ben een onafhankelijk object, maar kan me wel binnen andere objecten begeven (kantoor) en ik kan andere objecten manipuleren (toetsenbord, computer). Zo manipuleer ik jouw hersenen terwijl je dit leest.
Objecten herkennen
Objecten zijn dus losstaande dingen. Objecten hebben bepaalde eigenschappen. Zo heb ik blauwe ogen, ben ik 1.83m lang en houd ik van bier. Als ik nu mijn kleur ogen wil veranderen dan zal mijn lichaam dat moeten doen. Een object van buitenaf zou hooguit mijn ogen kunnen maskeren, maar niet daadwerkelijk de kleur veranderen. Misschien dat ik met een bepaalde injectie (=object) wel mijn kleur ogen kan veranderen; dan wordt er dus een object van buitenaf in mij geplaatst waardoor mijn lichaam zelf de kleuren van mijn ogen aanpast. Het spul uit de injectie komt in mijn lichaam dus behoort tot mijn lichaam.
Kort gezegd: objecten hebben bepaalde eigenschappen en die eigenschappen kunnen alleen door het object zelf worden gemanipuleerd.
- 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
Als je objecten uit m'n verhaaltje hierboven gaat vissen dan kom je tot iets van: ik, oog, bier, lichaam, kleur, injectie, injectiespul. Wat je hier ziet is dat "blauw" een eigenschap van "kleur" is, maar dat "kleur" weer een eigenschap van "oog" is en "oog" weer een eigenschap van "lichaam" en "lichaam" een eigenschap van "ik". Dus een eigenschap van een object kan op zichzelf ook weer een object zijn. Dat is zelfs heel gebruikelijk, zoals je ziet.
Klinkt ingewikkeld, maar zo is het leven ook. Ik hoop dat je nu in ieder geval een beetje inziet wat een object is. Want het is allemaal veel simpeler dan je denkt. Het is niets technisch.
Voorbeeld: Datum? Of ook Dag, Maand, Jaar? :S
Het is logisch dat je voor een datum een apart object maakt binnen je systeem, omdat een datum een vrij specifiek 'iets' is. Maar moet je nu ook een Dag, Maand en Jaar object maken?
Je kunt bedenken: heeft een dag, maand of jaar zelf nog specifieke eigenschappen? Op zich wel, want een dag valt binnen de range(1,31), een maand binnen de range(1,12) en elke maand heeft een unieke naam (januari, februari, etc). Maar het zijn wel constante waardes waar verder niet veel spannends mee gebeurt. En de date()-functie van PHP kan al erg veel.
In dit geval raad ik aan gewoon het Datum-object eens te maken en dan te kijken of je code flexibeler wordt van aparte dag/maand/jaar-objecten of dat het juist een rotzooitje wordt.
Je moet gewoon kijken of het nut heeft een laag dieper te gaan, of het nut heeft om nog meer objecten te maken voor sub-onderdelen. Als je in je Datum-object allemaal variabelen moet gaan setten die specifiek voor een Dag gelden, of voor een Maand, dan ben je dus te veel binnen één object bezig.
Dit soort dingen is gewoon een beetje logisch nadenken en kijken of je niet meerdere objecten aan het definiëren bent binnen één object. Als je meerdere functies krijgt als formatDay(), forwardDay($days), resetDay(), etc, dan zal je wel een apart object moeten gebruiken. Want dan zijn de methods niet meer het Datum-object aan het manipuleren, maar het (niet-bestaande & te creëren) Dag-object.
Strict gezien moet je wel aparte Dag-, Maand en Jaarobjecten maken omdat het op zichzelf 'dingen' zijn.
Misschien zul je weten dat PHP zelf al een DateTime class kent en je afvragen waarom je die niet gewoon kan gebruiken. Mijn mening is dat je die in deze situatie juist wél zou moeten gebruiken, maar als voorbeeld is dit een stuk duidelijker! Ik kom later in deze handleiding nog terug op het gebruik van de DateTime class in PHP5.