HTML via return PHP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Stefan Janssen

Stefan Janssen

05/03/2020 13:58:05
Quote Anchor link
Hallo,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}

?>


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 -
 
PHP hulp

PHP hulp

22/11/2024 22:37:32
 
- Ariën  -
Beheerder

- Ariën -

05/03/2020 14:06:48
Quote Anchor link
Je kan natuurlijk ook je string over meerdere regels laten lopen, zonder op elke regel deze toe te kennen. Tenzij je bijvoorbeeld je string wilt onderbreken voor een bepaalde statement, zoals in dit praktische voorbeeld.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
function output(){
    $outputhtml = '<div>Hier wat content</div>';
    for ($i = 0; $i <= 5; $i++) {
            $outputhtml .= '<div>Hier andere content, regel '.$i.'.</div>';
    }

    $outputhtml .= '<div>Nog wat content</div>';
    return $outputhtml;
}

?>
Gewijzigd op 05/03/2020 16:24:04 door - Ariën -
 
Michael -

Michael -

05/03/2020 16:00:10
Quote Anchor link
Je zult het toch in een keer moeten returnen, dus zo kan prima.
 
Thomas van den Heuvel

Thomas van den Heuvel

05/03/2020 16:42:59
Quote Anchor link
Het "probleem" van bovenstaande aanpak is dat dit nogal onleesbaar wordt - het is niet langer een plak HTML, maar simpelweg een plak tekst zonder betekenis. Ook wordt er geen onderscheid meer gemaakt tussen wat statisch (onveranderlijk) en dynamisch is. En je komt mogelijk in de knoei wanneer de content quotes of variabelen bevat - je zult dan de string moeten afbreken en weer moeten starten en mogelijk moet je hierbij enkele of dubbele quotes escapen ofzo... dit wordt al snel een onleesbare warboel.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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();
}

?>
Gewijzigd op 05/03/2020 16:44:51 door Thomas van den Heuvel
 
Stefan Janssen

Stefan Janssen

05/03/2020 22:56:45
Quote Anchor link
Woow Thomas,


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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.