Objectgeoriënteerd PHP (versie 5) Kennisvereisten: Ervaring met programmeren in PHP met MySQL Je weet wat een class of klasse is Je weet wat een instantie van een klasse (een object) is Je weet wat een attribuut van een klasse of object is Je weet wat de constructor van een klasse is Je weet wat een methode is Je hebt al eens geprogrammeerd met functies
OO PHP, de tijd van spaghetticode is voorbij Omdat PHP de laatste jaren steeds vaker gebruikt wordt voor de ontwikkeling van webapplicaties en omdat deze webapplicaties steeds complexer worden, is object georiënteerd ontwerpen en programmeren met PHP een voorwaarde geworden van een groeiend aantal bedrijven die zich bezighouden met webontwikkeling. De tijd van programma’s maken waar de code een onoverzichtelijke brei van functies, regels, loops, if-statements en programmaregels is (de zogenaamde spaghetticode), is nu eigenlijk verledentijd. Natuurlijk zijn beginnende ontwikkelaars zo begonnen, maar een professioneel applicatieontwikkelaar moet de zaken anders aanpakken. Object georiënteerd programmeren is daarbij de standaard. Een goed boek om deze techniek te leren is: PHP5 Superboek Auteurs: Wouter Tengeler en Marco van Hylckema Vlieg Uitgever : van Duren Media ISBN : 90-5940-137-9 Verder zijn er de nodige websites waarbij voorbeelden van objectgeoriënteerd PHP (of Objec Oriented PHP, OO PHP) te vinden zijn. In deze korte cursus worden een aantal voorbeelden besproken van OO PHP code, waarbij de complexiteit telkens toeneemt. Het is de bedoeling dat je OO PHP geleidelijk gaat toepassen in projecten op het gebied van webontwikkeling.
Cursus Objectgeoriënteerd PHP v1.2
1
1.
Basisconcepten in OO PHP
1.1
Een klasse in PHP
Een klasse is het blauwdruk of ontwerp van een object. In een klasse zijn de eigenschappen en de methodes (het gedrag) van een object gedefinieerd. Het doel van een klasse is: de werkelijkheid waarvoor de software wordt geschreven zoveel mogelijk benaderen. Object georiënteerd programmeren houdt zich dus bezig met objecten uit die werkelijkheid. Het voordeel van deze methodiek is, dat betrokken personen zowel in de ontwerpfase als in de realisatiefase kunnen spreken over dezelfde zaken. Dus als bijvoorbeeld de medewerker die het functioneel ontwerp maakt, spreekt van een tafel (als het gaat om software voor een reserveringssysteem van een restaurant), dan moet ook bij de programmeur het ontwerp van die tafel in zijn code verwerken. In het volgende codefragment 1.1 zie je een eenvoudig voorbeeld van hoe een tafel in software kan worden beschreven. tafelnummer=$pTafelnummer; $this->aantal=$pAantal; } function SetTafelnummer($pTafelnummer) { $this->tafelnummer=$pTafelnummer; } function SetAantal($pAantal) { $this->aantal=$pAantal; } function GetTafelnummer() { return $this->tafelnummer; } function GetAantal() { return $this->aantal; } } Codefragment 1.1
Cursus Objectgeoriënteerd PHP v1.2
2
Toelichting bij codefragment 1.1 class ClsTafel De definitie van de klasse ClsTafel. De naamgeving die hier wordt gebruikt is niet gestandaardiseerd. Toch worden vaak de volgende regels gebruikt: de naam van een klasse begint met een hoofdletter en in de naam zie je dat het hier een klasse betreft. Vandaar dat ik hier bij een klasse de naam laat beginnen met Cls. private $tafelnummer; private $aantal; Dit zijn de attributen of velden van de klasse Tafel. Deze attributen zijn alleen binnen de body van de klasse te benaderen, omdat deze attributen private zijn gedefinieerd. Hierover volgt in leeropdracht 1.2 meer. function __construct($pTafelnummer,$pAantal) { $this->tafelnummer=$pTafelnummer; $this->aantal=$ pAantal; } Dit is de constructor van de klasse Tafel. In dit geval heeft de constructor twee parameters. Met deze parameters kun je de attributen een beginwaarde geven. Dit doe je met de code $this->tafelnummer=$pTafelnummer; . De constructor wordt meestal aangesproken als van de klasse een object wordt gemaakt. Omdat $tafelnummer een attribuut van de klasse zelf is, moet je deze benaderen met $this. $this betekent de klasse zelf. Het teken -> is het scheidingsteken tussen een klasse of een object en een attribuut of een methode. Let op dat bij de notatie $this->tafelnummer het attribuut $tafelnummer geen $-teken bevat. In PHP 4 kun je voor de constructor niet de methode __construct() gebruiken. In dit geval heeft de constructor met dezelfde naam als de klasse zelf, dus ClsTafel(). function SetTafelnummer($pTafelnummer) { $this->tafelnummer=$pTafelnummer; } De methode SetTafelnummer(). In PHP spreekt men nog van functions. In het OO taalgebruik spreekt men van methodes. Methodes bepalen het gedrag van de klasse of het daaruit afgeleide object. Met deze methode kun je het attribuut $tafelnummer een waarde geven buiten de constructor om.
In codefragment 1.2 zie je hoe de klasse ClsTafel verder wordt gebruikt. GetTafelnummer()." heeft ". $objTafel->GetAantal()." zitplaatsen"; Codefragment 1.2
Cursus Objectgeoriënteerd PHP v1.2
3
Toelichting bij codefragment 1.2 include_once "ClsTafel.php"; Om gebruik te maken van de klasse ClsTafel moet je het bestand waar deze klasse is geprogrammeerd includen, anders kun je deze klassen niet gebruiken. $objTafel=new ClsTafel(1,4); Hier wordt de instantie $objTafel van de klasse ClsTafel gemaakt. De parameters 1 en 4 zijn de parameters van de constructor. Er wordt hier dus een object gemaakt waarvan het attribuut $tafelnummer de waarde 1 heeft en het attribuut $aantal de waarde 4. De naamgeving die hier wordt gebruikt is niet gestandaardiseerd. Toch worden vaak de volgende regels gebruikt: de naam van een instantie (object) begint met een kleine letter en in de naam zie je dat het hier een object betreft. Vandaar dat ik hier bij een object de naam laat beginnen met obj. $objTafel->GetTafelnummer() Hier wordt de methode GetTafelnummer() van het object $objTafel aangeroepen. Voor het teken -> staat de naam van het object, achter het teken -> staat in dit geval de methode die moet worden aangeroepen. In de meeste OO programmeertalen, waaronder C#, wordt in plaats van het teken -> het teken . (punt) gebruikt. Omdat in PHP de punt al een andere betekenis heeft, is gekozen voor -> .
Opdracht 1.1 In deze opdracht gebruik je codefragmenten 1.1 en 1.2. a.
Neem codefragment 1.1 over in een editor en sla het op in een webserver onder de bestandsnaam ClsTafel.php
b.
Neem codefragment 1.2 over in een editor en sla het op in een webserver.
c.
Run codefragment 1.2 op de webserver. Het volgende resultaat moet je dan krijgen:
Figuur 1.1
Cursus Objectgeoriënteerd PHP v1.2
4
Figuur 1.2
d.
Maak een formulier waarmee van een tafel het aantal stoelen kunt instellen. Na het posten van deze waarden moeten de gegevens van de tafel gepresenteerd worden zoals je in figuur 1.1 ziet
e.
Schrijf tot slot de waarden die je zojuist hebt ingesteld in het object objTafel op in een databasetabel (de tabel tafels van de database restaurant).
f.
Maak de klasse ClsDb met de volgende attributen en methodes: Attributen: Methodes:
$host, $user, $password en $database VerbindMetDb() en SlaTafelOp($pTafelnummer,$pAantal)
De class heeft een constructor met de parameters $pHost, $pUser ,$pPassword en $pDatabase. Bij het instantiëren van de class krijgen de attributen van de class een waarde via deze parameters . De parameters van de methode SlaTafelOp() refereren achtereenvolgens het tafelnummer en het aantal. Het is de bedoeling dat met deze class een verbinding met een database tot stand kan komen (met de methode VerbindMetDb() ) en de query kan worden uitgevoerd om de eigenschappen van de tafels op te slaan (met de methode SlaTafelOp() ). g.
Maak de applicatie af zodat de tafeleigenschappen met behulp van de klasse ClsDb wordt opgeslagen.
Cursus Objectgeoriënteerd PHP v1.2
5
1.2 Toegankelijkheid van attributen en methodes In figuur 1.2 is de klasse ClsTafel uit de vorige paragraaf schematisch weergegeven. In het bovenste deel zie je de naam van de klasse, in het middelste deel de attributen (zonder $-teken) en in het onderste deel de methodes). Verder zie je voor de attributen en de methodes een symbool (- of +). Deze symbolen zegen iets over de toegankelijkheid van de attributen en methoden. -
Betekent private, dat wil zeggen dat de methode of attribuut alleen binnen de klasse is te benaderen.
+
Betekent public, dat wil zeggen dat de methode of attribuut ook buiten de klasse is te benaderen.
In de klasse ClsTafel zijn alle methoden public gedefinieerd. In de code van de klasse ClsTafel is de methode SetTafelnummer($pTafelnummer) als volgt gedefinieerd: function SetTafelnummer($pTafelnummer) { $this->tafelnummer=$pTafelnummer; } Je had deze methode ook op de volgende manier kunnen definieren: public function SetTafelnummer($pTafelnummer) { $this->tafelnummer=$pTafelnummer; } In PHP 5 maakt het niet uit of je het public wel of niet gebruikt bij een methode. Voor een public attribuut moet je of het voorvoegsel var of het voorvoegsel public gebruiken, bijvoorbeeld: public $tafelnummer; var $aantal; In PHP 5 geniet het voorvoegsel public voor public gedefinieerde attributen de voorkeur. In PHP 4 kent men de niveaus voor toegankelijkheid helemaal niet. Hier is alles public en voor attributen gebruik ja hier altijd het voorvoegsel var.
ClsTafel - tafelnummer - aantal + __construct($pTafelnummer,$pAantal) + SetTafelnummer($pTafelnummer) + SetAantal($pAantal) + GetTafelnummer() + GetAantal() Figuur 1.2 Er bestaat nog een derde niveau van toegankelijkheid, namelijk protected. Hierop wordt in paragraaf 1.3 teruggekomen.
Cursus Objectgeoriënteerd PHP v1.2
6
Opdracht 1.2 In deze opdracht gaan we oefenen met de toegankelijkheidsniveaus. We gebruiken in deze opdracht de klasse ClsTafel uit de vorige paragraaf. a. Neem codefragment 1.3 over in een editor en sla het op een webserver op.
b. Run het script op de webserver. Je zal niets merken, er wordt alleen een instantie van de klasse ClsTafel op de server gemaakt. c. Verander het niveau van toegankelijkheid van de constructor van de klasse ClsTafel in private. Dit doe je als volgt: private function __construct($pTafelnummer,$pAantal) d. Run het script van vraag 1 weer. Je krijgt nu een foutmelding. Geef een verklaring voor deze foutmelding. Verklaring:
e. Maak de constructor weer public. f.
Breid codefragment 1.3 als volgt uit:
tafelnummer=5; ?> Codefragment 1.4
g. Run het script en geef een verklaring voor de foutmelding. Verklaring:
Cursus Objectgeoriënteerd PHP v1.2
7
h. Stel het attribuut tafelnummer in de klasse ClsTafel in op public. i.
Breid codefragment 1.4 als volgt uit:
tafelnummer=5; echo 'Nieuw tafelnummer: '.$objTafel->GetTafelnummer();?> Codefragment 1.5
j.
Run het script.
k. Verander het niveau van toegankelijkheid van de methode GetTafelnummer in de klasse ClsTafel in protected: protected function GetTafelnummer() . l.
Run het script. Je krijgt een foutmelding. Waarschijnlijk kun je nog niet verklaren waarom deze foutmelding ontstaat. Dit hoeft dan ook niet.
m. Stel alle attributen en methodes weer op een toegankelijkheidsniveau, zoals je in figuur 1.2 ziet.
Cursus Objectgeoriënteerd PHP v1.2
8
1.3
Overerving
Vaak wordt overerving in verband gebracht met een erfenis na een sterfgeval. Je krijgt iets van dat van de overledene was. Overerving speelt ook een rol als het gaat om eigenschappen tussen bloedverwanten (hij lijkt sprekend op z'n vader). In de ontwikkeling van software komt overerven (Engels: inharitance) ook voor tussen klassen. Zo is het mogelijk dat de ene klasse attributen en methodes overerft van een andere klasse. In figuur 1.3 is dit schematisch weergegeven. Zo’n schematische weergave van één of meer klassen heet een klassendiagram. ClsTafel - tafelnummer - aantal + __construct($pTafelnummer,$pAantal) + SetTafelnummer($pTafelnummer) + SetAantal($pAantal) + GetTafelnummer() + GetAantal()
ClsReserveerTafel - reserveerDatum - klantnaam - aantalPersonen + __construct($tn,$a) + MaakReservering($pDatum,$pKlant,$pAantalPersonen) + BekijkReservering() Figuur 1.3
Toelichting bij figuur 1.3 De klasse ClsTafel is de klasse waarmee we tot nu toe hebben gewerkt. In het restaurant kent men ook bijzondere tafels, namelijk tafels die men kan reserveren. Dit zijn de zogenaamde reserveertafels. Dit zijn tafels met dezelfde attributen en methodes als een gewone tafel (gedefinieerd in de klasse ClsTafel), maar hebben iets extra’s dat met het reserveren van die tafels te maken heeft. In figuur 1.6 zie je dat de klasse ClsReserveerTafel de volgende attributen lijkt te hebben: reserveerDatum, klantnaam en aantalPersonen Echter … omdat de klasse ClsReserveerTafel ook de attributen van de klasse ClsTafel overerft, zou de klasse ClsReserveerTafel, naast de eigen attributen, dus ook de attributen: Tafelnummer en aantal moeten hebben.
Cursus Objectgeoriënteerd PHP v1.2
9
Iets dergelijks geldt voor de methodes van de klasse ClsReserveerTafel. De methodes van ClsReserveerTafel zelf zijn: MaakReservering en BekijkReservering en overerft de volgende methodes van de klasse ClsTafel: SetTafelnummer(), SetAantal(), GetTafelnummer() en GetAantal()
Dat ClsReserveerTafel de attributen en methodes van ClsTafel overerft wordt aangegeven met het symbool :
Op deze wijze hoef je elke methode en attribuut slechts één maal te definiëren en te programmeren in de code, terwijl sommige methodes en attributen toch in meer klassen bruikbaar zijn. Hoe dit in de PHP-code wordt verwerkt leer je in Leeropdracht 1.3. Eerst even een paar nieuwe termen en stellingen die te maken hebben met figuur 1.6
De klasse ClsReserveerTafel is een subklasse of subclass van ClsTafel. De klasse ClsTafel is een superklasse of superclass van ClsReserveerTafel. In plaats van superklasse wordt ook wel basisklasse, baseclass of parent gebruikt. Een subklasse overerft alle attributen en methoden van zijn superklasse of basisklasse, behalve als ze private gedefinieerd zijn. Een subklasse is een verbijzondering van een superklasse Een subklasse is een meer specifieke klasse dan de subklasse
Laat deze zaken maar eens goed tot je doordringen.
Cursus Objectgeoriënteerd PHP v1.2
10
Leeropdracht 1.3 Deze opdracht is bedoeld om te leren omgaan met het principe van overerving. Het schema van figuur 1.6 vormt de basis van deze leeropdracht. De klasse ClsTafel hebben we al. We gaan eerst de klasse ClsReserveerTafel maken. In codefragment 1.6 zie je een deel van de code van deze klasse.
Cursus Objectgeoriënteerd PHP v1.2
11
Toelichting bij codefragment 1.7 class ClsReserveerTafel extends ClsTafel In deze regel wordt de klasse ClsReserveerTafel gedefinieerd. In dit geval is er een super-subklasse relatie (zie figuur 1.6). De code extends ClsTafel geeft deze relatie weer: ClsReserveerTafel is een subklasse van ClsTafel. function __costruct($pTafelnummer,$pAantal) { ClsTafel::__construct($pTafelnummer,$pAantal); } De constructor van de klasse ClsReserveerTafel. Binnen deze constructor wordt ook de constructor van de superklasse (de parent) aangeroepen met: ClsTafel::__construct($pTafelnummer,$pAantal); . Let hier op de parameteroverdracht van de constructor van ClsReserveerTafel naar de constructor van de parent. In de regel ClsTafel::__construct($pTafelnummer,$pAantal); zie je het teken :: (twee maal dubbele punt). Dit symbool wordt de Scope Resolution Operator genoemd. De scope resolution operator gebruik je als je een methode aanroept in een bepaalde klasse, zonder dat die klasse geïnstantieerd is. In dit geval wordt de constructor van de klasse ClsTfel aangeroepen zonder de klasse ClsTafel te instantiëren. Omdat ClsTafel de basisklasse of parent van de klasse ClsReserveerTafel is mag je ook het gereserveerde woord parent gebruiken. In dit geval hebben de volgende twee regels hetzelfde effect: ClsTafel::__construct($pTafelnummer,$pAantal); parent::__construct($pTafelnummer,$pAantal); In de constructor krijgen de attributen van de klasse ClsReserveerTafel in dit geval niet een beginwaarde. De rest van de code spreekt voor zich. a. Kopieer codefragment 1.7 in een editor en sla het bestand op als ClsReserveerTafel.php b. Gebruik voor de code van de methode MaakReservering codefragment 1.8.
function MaakReservering($pDatum,$pKlant,$pAantalPersonen) { $this->reserveerDatum=$pDatum; $this->klantnaam=$pKlant; $this->aantalPersonen=$pAantalPersonen; } Codefragment 1.8 c. Gebruik voor de code van de methode BekijkReservering() codefragment 1.9 function bekijkReservering() { return "Tafelnummer: ".$this->tafelnummer."
". "Reserveerdatum: ".$this->reserveerDatum."
". "Klantnaam: ".$this->klantnaam."
". "Aantal personen: ".$this->aantalPersonen."
"; } Codefragment 1.9
Cursus Objectgeoriënteerd PHP v1.2
12
d. Neem codefragment 1.10 over in een editor en sla het op de webserver op.
MaakReservering($datum,$klant,$aantalPersonen); echo $GereserveerdeTafel->BekijkReservering(); Codefragment 1.10
e. Run codefragment 1.10. Wat merk je op? Na uitvoeren van codefragment 1.9 zie het resultaat van figuur 1.4.
Figuur 1.4
Probleem: Bij de instantiëring van de klasse ClsReserveerTafel is toch duidelijk het tafelnummer opgegeven. Bij het aanroepen van de methode BekijkReservering wordt het tafelnummer echter niet weergegeven.
Cursus Objectgeoriënteerd PHP v1.2
13
Oorzaak: In de methode BekijkReservering van de klasse ClsReserveerTafel wordt met $this->tafelnummer aangeroepen. Het attribuut $tafelnummer is gedefinieerd in de klasse ClsTafel. Je zou zeggen dat hij dan ook gedefinieerd is in de klasse ClsReserveerTafel, omdat ClsReserveerTafel alle attributen uit ClsTafel overerft. Dit is echter niet helemaal waar, want het attribuut $tafelnummer is een private atrribuut binnen de klasse ClsTafel en kan daarom alleen binnen deze klasse worden gebruikt. Indien je een attribuut binnen een klasse en zijn subklasse kunnen gebruiken, dan moet je dit attribuut protected definiëren. Oplossing: Het attribuut $tafelnummer in de klasse ClsTafel moet protected worden gedefinieerd. Dit doe je als volgt: protected $tafelnummer; f.
Maak het attribuut tafelnummer van de klasse ClsTafel protected en run het script opnieuw. Je ziet dat het tafelnummer nu wel verschijnt.
De drie toegankelijkheidsniveaus zijn nu dus (let op de symbolen):
-
betekent private, dat wil zeggen dat de methode of het attribuut alleen binnen de klasse is te benaderen.
+
betekent public, dat wil zeggen dat de methode of het attribuut ook buiten de klasse is te benaderen.
#
betekent protected, dat wil zeggen dat de methode of het attribuut alleen binnen de klasse of binnen een van de subklassen van die klasse kan worden benaderd.
In figuur 1.5 zie je het klassendiagram van de applicatie die je zojuist hebt gemaakt, maar nu met aangepaste toegankelijkheidsniveau’s voor de attributen tafelnummer en aantal ClsTafel # tafelnummer # aantal + __construct($pTafelnummer,$pAantal) + SetTafelnummer($pTafelnummer) + SetAantal($pAantal) + GetTafelnummer() + GetAantal()
ClsReserveerTafel - reserveerDatum - klantnaam - aantalPersonen + __construct($pTafelnummer,$pAantal) + MaakReservering($pDatum,$pKlant,$pAantalPersonen) + BekijkReservering()
Figuur 1.5
Cursus Objectgeoriënteerd PHP v1.2
14
Opdracht 1.4 In deze opdracht gaan we gebruik maken van de klasse ClsDb die je hebt gemaakt in opdracht 1.1. In figuur 1.13 zie je het klassendiagram van de klasse ClsDb.
ClsDb - host - user - password - database + __construct($pHost,$pUser,$pPassword,$pDatum) + VerbindMetDb() + SlaTafelOp($pTafelnummer,$pAantal) Figuur 1.6 We gaan deze klasse nu als volgt opsplitsen in de klasse ClsConnectDb en ClsQuery:
ClsConnectDb - host - user - password - database + __construct($pHost,$pUser,$pPassword,$pDatum) + VerbindMetDb()
ClsQuery + __construct(…) + SlaTafelOp($pTafelnummer,$pAantal) Figuur 1.7 a.
Maak in aparte PHP-bestanden de klassen ClsConnectDb en ClsQuery. In de klasse ClsQuery moet de constructor van de basisklasse worden aangeroepen. De parameters van de constructor zie je niet in het klassendiagram. Uiteraard moet je ze wel toepassen in je programma.
b.
Maak een programma wat hetzelfde kan als het programma van opdracht 1.1.g maar dan met de klassen uit het klassendiagram van figuur 1.7.
Cursus Objectgeoriënteerd PHP v1.2
15
In ons voorbeeld van het reserveringssysteem van het restaurant hebben we gebruik gemaakt van object georiënteerd programmeren in PHP 5. Deze vorm van programmeren is steeds meer standaard geworden als het gaat om het ontwikkelen van applicaties. De meesten van jullie zullen OO programmeren maar lastig vinden en de opdrachten in dit hoofdstuk eigenlijk een beetje te simpel. OO programmeren wordt als een stapje terug ervaren, want je hebt ten slotte veel ingewikkelder applicaties gemaakt. Dat het een stapje terug is is misschien waar, omdat het hier om het leren OO programmeren gaat en niet om nog ingewikkelder programmeren. Het gaat hier om programmeren volgens de OO structuur en dat wordt dan weer als lastig ervaren. Je hebt op het gebied van complexiteit in het programmeren dan een stapje terug gedaan, maar op het gebied van structuur in het programmeren een behoorlijke sprong vooruit gemaakt. In het volgende hoofdstuk gaan we verder gebruik leren maken van associaties tussen klassen onderling. In dit hoofdstuk hebben we hier al mee gewerkt, namelijk de associatie tussen een klasse en een subklasse. Zo’n associatie wordt ook wel een generalisatie associatie genoemd en hiervoor hebben we het symbool
gebruikt.
1.4 Afhankelijkheid (dependency) We spreken van een afhankelijkheid of dependency als een instantie van een klasse wordt gebruikt binnen een andere klasse. In een klassendiagram kan dat op de volgende manier worden weergegeven (zie figuur 1.15):
ClsA
ClsB
Figuur 1.15
In figuur 1.15 is sprake van een afhankelijkheid waarbij een instantie van klasse ClsB gebruikt wordt in de klasse ClsA. Je kunt het klassendiagram van figuur 1.15 ook als volgt lezen: Klasse ClsA gebruikt klasse ClsB. In opdracht 1.5 gaan we hiermee eens aan de slag.
Cursus Objectgeoriënteerd PHP v1.2
16
Opdracht 1.5 In figuur 1.8 zie je het klassendiagram waarop we het programma in deze leeropdracht gaan baseren ClsTafel # tafelnummer # aantal + __construct() + SetTafelnummer($pTafelnummer) + SetAantal($pAantal) + GetTafelnummer() + GetAantal()
ClsReserveerTafel ClsKlant - klantNaam - klantTelefoon +__construct($pKlantnumer,$pTelefoon) + GetKlantNaam()
- reserveerDatum - objKlant - aantalPersonen + __construct() + MaakReservering($pTafelnummer,$pDatum,$objKlant,$pAantalPersonen) + BekijkReservering()
Figuur 1.8
Een paar aandachtspunten. Voor de klasse ClsTafel: De constructor is leeg. De attributen van deze klasse kan eventueel worden ingesteld met behulp van de methodes SetTafelnummer() en SetAantal() Metbehulp van de methodes GetTafelnummer() en GetAantal() kun je de waarden van die attributen weer oproepen. Omdat ClsTafel de parent is van de klasse ClsReserveerTafel, kun je deze methodes ook in een instantie van de klasse ClsReserveertafel gbruiken. Voor de klasse ClsReserveertafel De constructor van deze klasse leeg. Met behulp van de methode MaakReservering() kun je de attributen van de klasse ClsReserveerTafel een waarde geven. Het betreft hier de attributen die van belang zijn voor de reservering. In de methode MaakReservering() verwijst de parameter $pTafelnummer naar het attribuut tafelnummer van de parent ClsTafel. In de methode BekijkReservering() moet de klantnaam worden weergegeven. Dit is een attribuut van het object objKlant, wat op zijn beurt weer een attribuut is van de klasse ClsReserveerTafel. Om de klantnaam te bereiken binnen de klasse ClsReserveerTafel moet je de volgende code gebruiken: $this->objKlant->GetKlantNaam() Dit deel omdat het een attribuut van de klasse ClsReserveerTafel is.
Cursus Objectgeoriënteerd PHP v1.2
17
a.
Maak de klasse ClsKlant
b.
Pas de klasse ClsReserveerTafel aan zoals te zien is in figuur 1.8
De gegevens invoeren die van belang zijn voor de reservering mag je invoeren zoals je dat in figuur 1.10 ziet. c.
Test de applicatie. Het resultaat moet gelijk zijn aan dat van figuur 1.4, met dat verschil dat het tafelnummer wel zichtbaar is.
d.
Voeg aan de database een tabel reserveringen toe, met de velden die nodig zijn voor een reservering.
e.
Wijzig de applicatie zodanig dat de reserveringsgegevens niet alleen worden getoond, maar ook in de tabel reserveringen worden opgeslagen. Gebruik hiervoor de klassen ClsConnectDb en ClsQuery.
f.
Maak voor de applicatie die je nu hebt gemaakt het klassendiagram.
Opdracht 1.6 Bouw een reserveringsapplicatie met de klassen die je tot nu toe hebt gemaakt. Breid de klassen eventueel uit met nieuwe methoden. De functionele eisen van de applicatie zijn:
Een klant kunnen vastleggen in de database (nieuw tabel maken). Een tafel kunnen vastleggen in de database. Een reservering kunnen vastleggen in de database, waarbij de gegevens van de klant uit de database komen. De reserveringen voor een bepaalde dag weergeven.
Maak bij deze applicatie formulieren voor het invoeren van gegevens, en zorg ervoor dat je eenvoudig kunt navigeren tussen deze formulieren.
Cursus Objectgeoriënteerd PHP v1.2
18