Posts Tagged OOP
Examenpracticum: verdediging bij prof. Steegmans
Ken je dat gevoel van opluchting wanneer iets van je schouders valt na een ongelooflijk stresserende periode? Ik wel. Vandaag nog.
Ik volg het vak “objectgericht programmeren” dat deel uitmaakt van mijn major Computerwetenschappen. Hiervoor moesten we een practicum maken dat als examen dient voor dit vak. Vanmorgen om 9.30 uur was de verdediging.
Het project, zoals het doorgaans genoemd wordt, moest klaar zijn op 21 mei om 21 uur. Zoals bij vele deadlines, was dit net niet klaar. We hadden alles, maar het werkte niet allemaal naar behoren. Mensen als ik beginnen dan ook onmiddellijk te panikeren, stress komt tot een maximum, een kwartier voor de verdediging.
In volle stress vertrekken we naar prof. Steegmans voor onze verdediging. We, omdat die project per 2 gemaakt werd. Naim en ik waren gelukkig goed op tijd. Normaal gezien duurt de verdediging 50 minuten, maar omdat de prof een vergadering had om 10 uur, hadden we in principe maar een halfuur. Omdat we er 10 minuten vroeger waren, hebben we toch nog een verdediging van een dikke 40 minuten gehad.
Voor deze verdediging moesten we een klassendiagram meenemen, uitgewerkt in UML. Ik had er gisteren nog enorm wat tijd in gestoken maar het resultaat mag er wezen. Check dit!
Het ziet er eigenlijk best wel angstaanjagend uit, dus wij beginnen uit te leggen. Ik de geografie, Naim de oorlogvoering. Na amper enkele ogenblikken begint Steegmans al duchtig te knikken. “Ja, goed, mooi, … En kan dat?” – “nee, dat kan niet, dat vangen we op.” – “Schitterend!” Ik kreeg er echt een enorm goed gevoel bij, terwijl ik een enorm slecht gevoel had bij het indienen van de project op de deadline zelf. Maar toen was ik ook echt op.
Nu, het project wordt in 3 delen gemaakt, en je bouwt steeds verder op een vorig deel. Omdat we met deel 2 serieus hebben genkoeid, zijn we voor deel 3 deels met een nieuwe lei gestart. Hierbij zijn enkele pijnlijke fouten in de implementatie geslopen, die voor onaangename verrassingen zorgde op de verdediging. Maar die functionaliteit die we misten, zat er wel nog in van een vorig deel, maar de verwijzingen in andere methode waren op sommige plaatsen weg. Ook documentatie was op sommige plaatsen incorrect. Hopelijk heft hij daar niet te zwaar aan getild, dat zou jammer zijn.
Als kers op de taart moesten we ook een hoofdprogramma hebben. Helaas, dat ging een beetje serieus de mist in. Omdat er hier en daar fouten zaten, gingen al onze ventjes dood na een 50-tal beurten. Dit was eerder lachwekkend dan zorgwekkend, de methodiek zat goed, dus ook hier weer geen grote opmerkingen, alleen jammer dat het niet werkte…
Al bij al, als eindformule heeft de prof geconcludeerd dat het een zeer goed design was met vele mogelijkheden, maar er waren nog plaatsen voor verbeteringen, zoals interfaces voor klassen die het Populatiemodel gebruiken. Wat ook een hele bevestiging is, was dat hij hoopte ons nog in een ander vak later tegen te komen. Dit kan je uiteraard tegen iedereen zeggen, maar voor mij was dit toch een erg welgekomen bevestiging.
Opluchting alom. Nu weer tijd voor een ander vak… pfffft
OOP in PHP
Posted by MiST in Gedeelde Kennis on Saturday 7 March 2009
- PHP is leuk
- OOP is leuk en krachtig
De combinatie van beide is zeer interessant. Helaas, OOP PHP staat nog maar in zijn beginschoenen. Er wordt echter hard aan gewerkt om hier meer functionaliteit in te pompen. Helaas verschilt het PHP OOP paradigma ook een beetje van het algemene OOP paradigma. Deze post is vooral voor mijzelf bedoeld (ik vergeet altijd wat mogelijk is en wat niet), maar kan tegelijk ook voor anderen zeer nuttig zijn.
Wat kan er wel?
- Klassen definiëren (duh)
- Encapsulatie door visibility modifiers (private, protected, public)
- static en final (alleen voor methodes en klassen) keyword
- Overerving (extends)
- Interfaces
- abstracte klassen
- Destructoren
Wat kan er niet?
- Overloading (dikke bummer, me dunkt!)
- namespaces (wel vanaf PHP6)
- throws definitie meegeven in header
- returntype meegeven in header
Wat is er anders?
- public static final voor attributen heet ‘const’ en hoeven geen $ (omdat het geen variabelen zijn)
- PHP OOP heeft ‘magic methods’. Deze beginnen allemaal met 2 underscores (‘_’) en zijn gereserveerd voor PHP. Je kan ze echter wel overriden (in een uitgebreide klasse) en er nuttig gebruik van maken.
- wanneer je wil verwijzen naar methodes binnen je klasse moet je ALTIJD refereren met ‘$this->’.
- het puntje uit Java is ‘->’ voor objecten en ‘::’ voor klassen in PHP
Klassedefinitie
Zoals het gebruikelijke paradigma: class <classname> {}
Constructor
Waar in Java de constructor een (soort van) methode is die dezelfde naam heeft als de klasse, is dit bij PHP niet het geval. Het gaat wel (het was de eerste benadering van OOP in PHP4); sinds PHP5 is het gebruik van de magische methode __construct() echter aangeraden. Dit is perfect mogelijk wegens het missen van het concept overloading.
In PHP is de constructor ook een methode en krijgt dus als header ‘public function __construct()’
Nieuwe objecten aanmaken gebeurt ook op de gebruikelijke manier: $obj = new <classname>();
Overerving
De gebruikelijke manier: class <classname1> extends <classname2>
Meervoudige overerving wordt – zoals in Java – niet ondersteund.
Vergeet ook de parent::__construct() niet aan te roepen bij creatie en andere parent::methode() als je methodes overschrijft.
Interfaces
De gebruikelijke manier: class <classname> implements <interfacename>
Je kan wel meerdere interfaces implementeren (ook zoals Java)
Visibility modifiers
Ook in PHP kan je inhoud afschermen van de buitenwereld.
- public is voor iedereen toegankelijk
- protected is alleen toegankelijk voor zichzelf en kinderen
- private is alleen toegankelijk voor zichzelf
- publieke getters die private of protected waarden weergeven werken altijd
Autoload
Je kan in PHP meerdere klassen definieren in hetzelfde bestand. Hoewel het gaat, is het toch ook afgeraden, das niet handig. Je moet echter wel de nodige bestanden hebben geïntegreerd als je objecten van die klasse wilt aanmaken.
Hiervoor kan je de magische methode __autoload($classname) gebruiken. Wanneer PHP een klassedefinitie nodig heeft en deze niet gevonden heeft, zal hij uit zichzelf deze methode aanroepen (vandaar ‘magisch’). Als deze niet bestaat en de klasse niet is gevonden, heb je pech, en zal niet werken. Door de methode __autoload($classname) uit te werken kan je vooralsnog errors vermijden, zonder in elke klassedefinities een ellendig lange lijst met requires/includes te schrijven.
Magische Methodes
Met overloading bedoelt men in PHP het gebruik van de magische methodes. __construct() en __autoload werden al toegelicht. Verder zijn er nog:
- __destruct() — Objecten vernietigen, vanaf PHP6 komt er ook een Garbage Collector.
- __call() — wordt aangeroepen als je ontoegankelijke (private of protected) methoden aanroept
- __callStatic() — wordt aangeroepen als je ontoegankelijke (private of protected) methoden aanroept in statische context.
- __get() — wordt aangeroepen als je een ontoegankelijk (private of protected in enkele gevallen) attribuut oproept
- __set() — wordt aangeroepen als je een ontoegankelijk attribuut wil overschrijven
- __isset() — wordt gebruikt wanneer je isset() test op ontoegankelijke attributen
- __unset() — wordt aangeroepen wanneer je unset() uitvoert op ontoegankelijke attributen
- __sleep() — Opslaan van een object voor later gebruik
- __wakeup() — Terughalen van een object
- __toString() — objecten omzetten naar een String-representatie
- __invoke() — Wanneer een object wordt aangeroepen alsof het een methode was, zal deze methode uitgevoerd worden
- __set_state() — doet iets wanneer een object tot string wordt vervormd met var_export()
- __clone() — objecten klonen
Type Hinting
Zeer leuk dat ze hier aan gedacht hebben. PHP is zeer tolerant: floats, integers, booleans, … Je kan het allemaal door elkaar gebruiken, PHP converteert en interpreteert waar nodig. Toch is dit niet altijd handig wanneer je argumenten wil meegeven. Daarom kan je het type specifiëren en zo de input mogelijkheid limiteren.
public function __construct(Integer $number);
EDIT: Ik dacht dat deze hierboven kon, helaas: “Traditional type hinting with int and string isn’t supported.” Hier is het nog voor verbetering vatbaar!
public function __construct(array $array);
public function __construct(MyClass $myClass);
Exceptions
Zoals gebruikelijk: throwable en catchable
Je kan je eigen exceptions ook definieren door de klasse Exception te extenden.
Weetjes
- Een PHP bestand dat niets rechtstreeks output, heeft geen sluittag ‘?>’ nodig. Het gebruik ervan is in dat geval zelfs afgeraden, omdat het bij includes een hoop lastig debugwerk voorkomt (wanneer je layout ineens een lijn verspringt enzo).
- Je kan objecten aanmaken vanuit een variabele. Stel $var = “MyClass”, dan kan je schrijven: $obj = new $var(); en dan heb je een object van de klasse MyClass (als die voor PHP vindbaar is). Zelfde geldt voor methodes. $obj->$method(); Het is natuurlijk niet aan te raden dit zo te gebruiken gezien het niet echt een goede manier van programmeren is in mijn ogen.
- De superklasse van PHP heet ‘stdClass’. Alle objecten erven hiervan.
- Include nooit het bestand waarin je include regel staat, dan crasht apache…
- In PHP kan je op een luie manier velden initialiseren. Wanneer in Java een veld niet bestaat, compileert het niet; wanneer je bij PHP een veld aanroept dat niet gedefinieerd is, wordt het on-the-go aangemaakt en aangeroepen (omwille van de dynamische types in PHP).
Dat is het zowat, als me nog iets te binnen schiet, voeg ik het toe.

Recent Comments