Je vorige site in php werd op een gegeven moment een grote hooiberg. Overal stond code, je wist niet meer waar je moest zoeken. Aanpassingen waren nauwelijks mogelijk, en eigenlijk stond heel veel dubbel in je website, maar net weer een tikkie anders. Deze keer wil je het beter aanpakken, maar hoe?
Hiervoor kun je klassen gebruiken, waarmee je een structuur aanbrengt in je site. Je krijgt aparte klassen voor elk aparte onderdeel, hierbij kun je denken aan klassen voor je database, de gebruiker, de taal, error-handling, het systeem, de layout, etc...
In dit deel van de tutorial ga ik overerving uitleggen, en voorbeelding in de praktijk geven.
Herhaling
Als je dat nog niet gedaan hebt en nog weinig van klassen afweet, neem dan deel 1, deel 2 en/of deel 3 van deze tutorial door!
Deel 4
In dit deel ga ik uitleggen hoe je klassen in praktijk kunt gebruiken. Ik maak gebruik van meerdere voorbeelden.
Hier geef ik, in tegenstelling tot deel 3, kleine voorbeelden over het gebruik van klassen.
Evaluatie deel 3
Waarom is nou eigenlijk het systeem van deel 3, of een soortgelijk systeem gebaseerd op klassen, handig?
Eigenlijk heb je op het moment dat je class Page uitbreid met de betreffende klasse van de pagina, alle variabelen al klaarstaan. Je hebt een verbinding met de database, informatie over de gebruiker, etc.. Ook zit in het systeem verwerkt wat er moet gebeuren met foutmeldingen, en er zat een template- en taal-systeem in. Deze zijn allemaal te bereiken via die klasse Page, en door de overerving ook in je class Index, of welke klasse je ook maakt.
Je hoeft dus niet steeds op elke pagina een verbinding te maken met de database, of een header.php en footer.php te laden. Dit zit al in het systeem! Als je het systeem hebt, is het enige wat je nog moet doen op een specifieke pagina:
- init.php oproepen
- een klasse maken die class Page uitbreidt
- parent::__construct(); oproepen
- de output laten parsen
Voor de rest ben je in alles vrij!
Voorbeeld in praktijk #2
In PHP heb je niet geweldig veel aan klassen. Klassen zijn eigenlijk over komen waaien van programmeertalen als C/C++. Toch zijn er voordelen als je klassen gebruikt in PHP. Je code wordt er bijvoorbeeld overzichtelijker van, want de naam van de functie suggereert al wat een stukje code doet.
Maar wat kun je nog meer met klassen?
Er moet nog meer te doen zijn met de klassen. Laten we verder ingaan op de overerving.
Stel, je hebt een forum, een nieuws-systeem, en een gastenboek.
Wat hebben deze zaken overeen?
- elk bericht heeft een titel
- elk bericht heeft een auteur
- elk bericht heeft een bericht (dah )
- elk bericht heeft een datum
Je zou dus, in plaats van steeds alle HTML steeds te herschrijven voor elk zo'n systeem, één algemene klasse hiervoor kunnen gebruiken.
Je krijgt dat dus een algemene klasse genaamd 'MessageForm', welke je uitbreidt met klassen als 'ForumMessage', 'NewsMessage' en 'GuestbookMessage'. Het plaatsen, bewerken en eventueel verwijderen van berichten gaat dan via het MessageForm, de specifieke dingen die net het verschil maken tussen de 3 systemen plaats je in de uitbreidende klassen.
Een globaal overzichtje:
class MessageForm
function addForm(systeem) --> geef <form> met inhoud weer, leeg
function addSubmit(systeem) --> schrijf de info uit addForm naar de database (INSERT)
function editForm(systeem, id) --> geef <form> met inhoud weer, met het bericht, etc. van het meegegeven systeem en id
function editSubmit(systeem, id) --> schrijf de info uit editForm naar de database (UPDATE)
function delete(systeem, id) --> verwijder bericht
class ForumMessage extends MessageForm
function viewForum --> het forum-overzicht weergeven
function viewTopic --> een topic bekijken
class NewsMessage extends MessageForm
function addForm
if(is_admin()) parent::addForm('news')
// nieuws kan alleen geplaatst worden door admins, dus ook alleen voor het toelaten
// hier de rest
class GuestbookMessage extends MessageForm
// spreekt wel voor zich...
Voorbeeld in praktijk #3
Stel, je maakt een spel waarin je een aantal winkels hebt. Je hebt een kledingwinkel, een caféetje en een wapenwinkel. In de eerste 2 moet je met wit geld 'betalen', in winkel 3 met zwart geld. Je maakt dat dus een klasse Winkels (of class Shops) waarin je de overzichten van de winkel-voorraad uitstalt, en 3 uitbreidende klassen voor de kledingwinkel, cafe en wapenwinkel, waar je de 'betaling' afhandelt (o.a. verschil tussen wit en zwart geld).
#2 verder uitwerken: Terugkoppeling
We gaan weer terug naar de berichten (#2), maar we blijven bij het gastenboek.
Stel, iemand typt een bericht, maar je komt erachter dat hij zijn naam vergeten is. Je hebt het bericht in je $_POST, maar als je op vorige drukt krijgt de bezoeker weer een leeg form. Kan hij weer opnieuw beginnen.
Dat kan beter. Welke informatie krijgen we binnen? Een titel, een auteur(-snaam), en een bericht.
Nu gaan we, als er een fout optreedt, terugkoppelen naar het form.
Hoe doen we dat? Hier een globaal voorbeeld (even zonder taal-klasse, en verder ook niet compleet uitgewerkt):
<?php
// messageForm.class.php
require("../includes/init.php");
class MessageForm extends Page {
public function __construct() {
parent::__construct('messageForm');
$this->template->setVar('melding', '');
}
protected function addForm($titel='', $auteur='', $bericht='') {
$this->template->setVar('titel', $titel);
$this->template->setVar('auteur', $auteur);
$this->template->setVar('bericht', $bericht);
}
protected function addSubmit() {
$titel = $_POST['titel'];
$auteur = $_POST['auteur'];
$bericht = $_POST['bericht'];
if(empty($titel) || empty($auteur) || empty($bericht)) {
$this->template->setVar('melding', 'Je bent iets vergeten in te vullen!');
$this->addForm($titel, $auteur, $bericht); // terugkoppeling!
return; // bij een return wordt de functie 'afgesloten', dus onderstaande in de functie wordt dan niet meer uitgevoerd
}
$this->db->edit("INSERT INTO ....");
}
}
?>
(NB: merk hierboven de terugkoppeling op )
<?php
// guestbookMessage.php
require("messageForm.class.php");
class GuestbookMessage extends MessageForm {
public function __construct() {
parent::__construct();
if($_GET['action'] == 'plaats') {
$this->addForm();
}
elseif($_POST['action'] == 'plaats') {
$this->addSubmit();
}
$this->template->parse();
}
}
$GM = new GuestbookMessage();
?>
(NB: een dubbele extend kan dus ook, maar wel indirect (GuestbookMessage --> MessageForm --> Page))
<?php
// messageForm.php, template-bestand
?>
<!-- eigenlijk moet de form action automatisch, en niet hardcoded... -->
<form action="guestbookMessage.php" method="post">
<div>
<?=$vars['melding']?><br>
<br>
Naam: <input type="text" name="auteur" value="<?=$vars['auteur']?>"><br>
Titel: <input type="text" name="titel" value="<?=$vars['titel']?>"><br>
Bericht: <textarea name="bericht"><?=$vars['bericht']?></textarea><br>
</div>
</form>
Als er dus iets fout is, kun je door middel van de functies makkelijk terugkoppelen. Dit zou niet mogelijk zijn als je geen klassen gebruikt, of eigenlijk: als je geen functies gebruikt. Maar ja, om de functies te ordenen, gebruik je weer klassen.
#2 verder uitwerken: Vereenvoudigen
Weer in het gastenboek heb je een paar opties:
- bericht plaatsen
- bericht bewerken
- bericht verwijderen
Het bericht plaatsen en bewerken maakt in principe gebruik van hetzelfde form, niet?
Waarom zou je hier dan niet 1 van maken?
We strepen dus de functies editForm en editSubmit even weg, we kunnen het met addForm en addSubmit af (met eventueel andere namen).
De functies addForm en addSubmit worden dan weliswaar wat ingewikkelder, maar je hebt nog minder dubbele data!
Einde deel 4
Dit was deel 4 van deze tutorial. Ik hoop dat je er wat van opgestoken hebt!
PHP: Klassen
Deel 4: Klassen in praktijk 2
Deel 1: De basis
Deel 2: Basis uitbreiding
Deel 3: Klassen in praktijk 1
Deel 4: Klassen in praktijk 2
Introductie
Je vorige site in php werd op een gegeven moment een grote hooiberg. Overal stond code, je wist niet meer waar je moest zoeken. Aanpassingen waren nauwelijks mogelijk, en eigenlijk stond heel veel dubbel in je website, maar net weer een tikkie anders. Deze keer wil je het beter aanpakken, maar hoe?
Hiervoor kun je klassen gebruiken, waarmee je een structuur aanbrengt in je site. Je krijgt aparte klassen voor elk aparte onderdeel, hierbij kun je denken aan klassen voor je database, de gebruiker, de taal, error-handling, het systeem, de layout, etc...
In dit deel van de tutorial ga ik overerving uitleggen, en voorbeelding in de praktijk geven.
Herhaling
Als je dat nog niet gedaan hebt en nog weinig van klassen afweet, neem dan deel 1, deel 2 en/of deel 3 van deze tutorial door!
Deel 4
In dit deel ga ik uitleggen hoe je klassen in praktijk kunt gebruiken. Ik maak gebruik van meerdere voorbeelden.
Hier geef ik, in tegenstelling tot deel 3, kleine voorbeelden over het gebruik van klassen.
Evaluatie deel 3
Waarom is nou eigenlijk het systeem van deel 3, of een soortgelijk systeem gebaseerd op klassen, handig?
Eigenlijk heb je op het moment dat je class Page uitbreid met de betreffende klasse van de pagina, alle variabelen al klaarstaan. Je hebt een verbinding met de database, informatie over de gebruiker, etc.. Ook zit in het systeem verwerkt wat er moet gebeuren met foutmeldingen, en er zat een template- en taal-systeem in. Deze zijn allemaal te bereiken via die klasse Page, en door de overerving ook in je class Index, of welke klasse je ook maakt.
Je hoeft dus niet steeds op elke pagina een verbinding te maken met de database, of een header.php en footer.php te laden. Dit zit al in het systeem! Als je het systeem hebt, is het enige wat je nog moet doen op een specifieke pagina:
- init.php oproepen
- een klasse maken die class Page uitbreidt
- parent::__construct(); oproepen
- de output laten parsen
Voor de rest ben je in alles vrij!
Voorbeeld in praktijk #2
In PHP heb je niet geweldig veel aan klassen. Klassen zijn eigenlijk over komen waaien van programmeertalen als C/C++. Toch zijn er voordelen als je klassen gebruikt in PHP. Je code wordt er bijvoorbeeld overzichtelijker van, want de naam van de functie suggereert al wat een stukje code doet.
Maar wat kun je nog meer met klassen?
Er moet nog meer te doen zijn met de klassen. Laten we verder ingaan op de overerving.
Stel, je hebt een forum, een nieuws-systeem, en een gastenboek.
Wat hebben deze zaken overeen?
- elk bericht heeft een titel
- elk bericht heeft een auteur
- elk bericht heeft een bericht (dah
)
- elk bericht heeft een datum
Je zou dus, in plaats van steeds alle HTML steeds te herschrijven voor elk zo'n systeem, één algemene klasse hiervoor kunnen gebruiken.
Je krijgt dat dus een algemene klasse genaamd 'MessageForm', welke je uitbreidt met klassen als 'ForumMessage', 'NewsMessage' en 'GuestbookMessage'. Het plaatsen, bewerken en eventueel verwijderen van berichten gaat dan via het MessageForm, de specifieke dingen die net het verschil maken tussen de 3 systemen plaats je in de uitbreidende klassen.
Een globaal overzichtje:
Voorbeeld in praktijk #3
Stel, je maakt een spel waarin je een aantal winkels hebt. Je hebt een kledingwinkel, een caféetje en een wapenwinkel. In de eerste 2 moet je met wit geld 'betalen', in winkel 3 met zwart geld. Je maakt dat dus een klasse Winkels (of class Shops) waarin je de overzichten van de winkel-voorraad uitstalt, en 3 uitbreidende klassen voor de kledingwinkel, cafe en wapenwinkel, waar je de 'betaling' afhandelt (o.a. verschil tussen wit en zwart geld).
#2 verder uitwerken: Terugkoppeling
We gaan weer terug naar de berichten (#2), maar we blijven bij het gastenboek.
Stel, iemand typt een bericht, maar je komt erachter dat hij zijn naam vergeten is. Je hebt het bericht in je $_POST, maar als je op vorige drukt krijgt de bezoeker weer een leeg form. Kan hij weer opnieuw beginnen.
Dat kan beter. Welke informatie krijgen we binnen? Een titel, een auteur(-snaam), en een bericht.
Nu gaan we, als er een fout optreedt, terugkoppelen naar het form.
Hoe doen we dat? Hier een globaal voorbeeld (even zonder taal-klasse, en verder ook niet compleet uitgewerkt):
(NB: merk hierboven de terugkoppeling op
)
(NB: een dubbele extend kan dus ook, maar wel indirect (GuestbookMessage --> MessageForm --> Page))
Als er dus iets fout is, kun je door middel van de functies makkelijk terugkoppelen. Dit zou niet mogelijk zijn als je geen klassen gebruikt, of eigenlijk: als je geen functies gebruikt. Maar ja, om de functies te ordenen, gebruik je weer klassen.
#2 verder uitwerken: Vereenvoudigen
Weer in het gastenboek heb je een paar opties:
- bericht plaatsen
- bericht bewerken
- bericht verwijderen
Het bericht plaatsen en bewerken maakt in principe gebruik van hetzelfde form, niet?
Waarom zou je hier dan niet 1 van maken?
We strepen dus de functies editForm en editSubmit even weg, we kunnen het met addForm en addSubmit af (met eventueel andere namen).
De functies addForm en addSubmit worden dan weliswaar wat ingewikkelder, maar je hebt nog minder dubbele data!
Einde deel 4
Dit was deel 4 van deze tutorial. Ik hoop dat je er wat van opgestoken hebt!
Beoordelingen, correcties en tips zijn welkom!
Bewerkt: door marcootje