HTML via return PHP
Ik heb een vrij basic vraag en ben benieuwd naar jullie advies.
In een loop word een HTML gecreëerd en deze moet via een return terug gegeven worden.
Nu zet ik alles in een variabel en vervolgens een return.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
function output(){
$outputhtml = '<div>Hier wat content</div>';
$outputhtml .= '<div>Hier andere content</div>';
$outputhtml .= '<div>Nog watcontent</div>';
return $outputhtml;
}
?>
function output(){
$outputhtml = '<div>Hier wat content</div>';
$outputhtml .= '<div>Hier andere content</div>';
$outputhtml .= '<div>Nog watcontent</div>';
return $outputhtml;
}
?>
Is dit een nette manier van programmeren of is er nog een nettere manier?
Toevoeging op 05/03/2020 13:58:38:
In mijn code zijn natuurlijk wat meer lijnen ;-)
Gewijzigd op 05/03/2020 14:05:00 door - Ariën -
Je zult het toch in een keer moeten returnen, dus zo kan prima.
Dan rijst de vraag hoe vaak je deze functie uitvoert? Als dit slechts eenmalig is, dan kun je je afvragen waarom je dit in een functie stopt en niet direct weergeeft. Tenzij dit een soort van functionele groepering is zoals een header- of een footer-gedeelte van een HTML-document ofzo. Maar zelfs dan, als dit geen variabele delen bevat maar enkel statische HTML, waarom zou je dit dan via PHP laten lopen? Een eenvoudige vuistregel is waarschijnlijk: als je PHP niet per se nodig hebt voor bepaalde functionaliteit, gebruik het dan niet.
Als je dan toch aangewezen bent op de bovenstaande aanpak, maak dan -waarschijnlijk bij voorkeur- gebruik van output buffering. Dit is een mechanisme waarbij je content die normaal naar output gaat (direct weergegeven wordt) opvangt in een buffer. Deze buffer kun je dan na afloop direct tonen, of retourneren. Ook is het waarschijnlijk een goede gewoonte (EDIT: in het algemeen, bij gebruikmaking van functies) om altijd informatie te retourneren, in plaats van direct te tonen, tenzij je aan het debuggen bent en direct informatie wilt dumpen ofzo. Met een returnwaarde heb je namelijk altijd nog de keuze wat je met deze informatie doet voordat je besluit iets weer te geven.
Output buffers kun je ook nesten, je kunt dus meerdere niveaus apart bufferen. Ook zijn er opties om output te comprimeren, wat (op den duur veel) bandbreedte kan schelen.
Met output buffering hoeft de uitvoering van code en de weergave van bijbehorende output niet meer per se dezelfde volgorde te hebben. Dit opent (zeer) interessante mogelijkheden. Hierbij kun je een soort van callback-functionaliteit bewerkstelligen. Dit is niet snel makkelijk uit te leggen maar hier volgt een poging: stel je hebt een stuk functionaliteit voor het bouwen van een HTML-document. Hierin zit o.a. een titel tussen de <title></title> tags. Stel dat een van de pagina's in jouw website een artikel is. Dit artikel heeft een titel. Deze titel wil je ook graag in de paginatitel terugzien. Maar het artikel moet eerst geladen worden, en pas later worden weergegeven. Dit lijkt op een kip-ei situatie maar met output buffering is dit een koud kunstje. Je laadt eerst de artikel content en vangt deze op met de outputbuffer. Tegelijkertijd bewaar je de titel hiervan. Pas op het moment dat je alle informatie bij elkaar hebt draai je het HTML-document uit, met als titel de titel van het artikel en de content is de inhoud van de output buffer waarin de artikeltekst stond opgeslagen.
Op eenzelfde wijze kun je ook het contentgedeelte van andere typen pagina's eerst "uitvoeren". Hier zouden dus ook instructies in kunnen zitten om CSS- en JavaScript-bestanden in te laden als het contentgedeelte deze nodig heeft voor de weergave van de inhoud. Denk aan een formulier(systeem), een fotogalerij, ... alles eigenlijk :p.
Anyhow, in zijn simpelste vorm ziet output buffering er als volgt uit, toegepast op bovenstaande code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function output() {
ob_start(); // start output buffering
// misschien ook een goede gewoonte om in te springen om aan te geven dat dit een buffer blok is
?><div>Hier wat content</div>
<div>Hier andere content</div>
<div>
<p>Dit is stukken beter leesbaar nietwaar?</p>
</div>
<div>Nog watcontent</div><?php
// retourneer de inhoud van de buffer en verwijder de buffer
return ob_get_clean();
}
?>
function output() {
ob_start(); // start output buffering
// misschien ook een goede gewoonte om in te springen om aan te geven dat dit een buffer blok is
?><div>Hier wat content</div>
<div>Hier andere content</div>
<div>
<p>Dit is stukken beter leesbaar nietwaar?</p>
</div>
<div>Nog watcontent</div><?php
// retourneer de inhoud van de buffer en verwijder de buffer
return ob_get_clean();
}
?>
Gewijzigd op 05/03/2020 16:44:51 door Thomas van den Heuvel
Thanks voor de uitgebreide uitleg.
Ik heb het nu werkend zoals ik het hebben wil :)
En nu is het ook nog eens overzichtelijk en leesbaar!
Hartsikke bedankt.