Hoi,

Ik vraag me af wat de beste manier is als je meerdere regels tekst wilt echo'en.

Hier 3 voorbeelden (ik gebruik zelf altijd nummer 1):


Voorbeeld 1.

<?php
if(isset($_POST['a'])){
 echo 'Hallo,<br>
 dit is<br>
 een test';
}
?>

Voorbeeld 2.
<?php
if(isset($_POST['a'])){
 echo 'Hallo,<br>';
 echo 'dit is<br>';
 echo 'een test';
}
?>

Voorbeeld 3.
<?php
if(isset($_POST['a'])){
?>
 Hallo,<br>
 dit is<br>
 een test.
<?php
}
?>


Is hier een 'beste manier' van, of is dit puur wat je zelf het prettigst vind?
Voorbeeld 3.
het is overzichtelijker, en PHP hoeft zich er niet meer mee bezig te houden, wat weer voor dit kleine scriptje enkele nanosecondes zal schelen.

Voorbeeld 1 kan ook, maar ikzelf doe dat alleen voor grote lappen met HTML-code. VOor enkele regels gebruik ik een print/echo.
Het is maar net wat je het prettigst vind. Wel is goed er rekening mee te houden dat het goed leesbaar en overzichtelijk blijft

Zelf doe ik als volgt om nog maar een ander voorbeeld te geven
<?php
if( isset( $_POST['a'] ) ) {

echo 'Hallo' .PHP_EOL
. '<br />Dit is' .PHP_EOL
. '<br />een test.' .PHP_EOL;

}
?>
Ik vind ze alle drie even storend maar als je je script netjes opbouwt dan heb je je 'code' en je 'view' en zullen die echo's in ieder geval nooit in je code komen.

Wel heb ik een soortgelijke ervaring met queries. die schrijf ik dan meestal maar zo:


<?php
function createTable()
{
return $db->query("
CREATE TABLE IF NOT EXISTS `auteurs` (
`auteur_id` int(11) NOT NULL AUTO_INCREMENT,
`naam` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`geboren` date NOT NULL,
`nationaliteit` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`overleden` date DEFAULT NULL,
PRIMARY KEY (`auteur_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=6 ;
");
}
?>
Nou, dan zal ik nog even een andere optie in de groep gooien...
Hou wel even de opmerking van Frank in je achterhoofd: "maar als je je script netjes opbouwt dan heb je je 'code' en je 'view' en zullen die echo's in ieder geval nooit in je code komen."

Jouw voorbeeld zou ik vertalen naar:

<?php
if (isset($_POST['a'])) echo 'Hallo,<br>dit is<br>een test.';
?>
Past prima op 1 regel in dit geval.

Als het meerdere regels zijn, dan zou ik kiezen voor voorbeeld 3, maar ik zou wel inspringen:


<?php
if (isset($_POST['a'])) {
   ?>
   Hallo bla die bla bla bla bla bladie blablabla,<br>
   dit is bla die bla bla bla bla bladie blablabla<br>
   een bla die bla bla bla bla bladie blablabla test.
   <?php
}
?> 
Sorry even tussendoor ik ben eerste jaars leerling en ik wil informatica studeren, we hebben een opdracht gekregen en de opdracht moeten we woensdag inleveren. Wilt iemand de codes uitwerken en even kort uitleggen heel erg bedankt.
De opdracht is als volgt:

"opdracht van school"

Alvast bedankt!

Aan overige leden: graag niet reageren op de vraag van kees van Huizen.

@kees van Huizen:

Kees, het is niet de bedoeling dat je zomaar het topic van iemand anders gaat kapen!
Daarnaast:

>> Wilt iemand de codes uitwerken en even kort uitleggen heel erg bedankt.

Zo werkt het hier dus niet. Eerst zelf moeite doen. Als het niet lukt kun je een vraag stellen.
Mijn antwoord is puur persoonlijk en moet je nemen as is.

(voorbeeld 3) Ik vind het storend wanneer men de php-haakjes sluit en terug opent.
Dat maakt dat je structuur verliest; dat je moeilijker kan zien welke accolade waarbij hoort ...

Wat ook het voordeel moge zijn, het weegt niet op tegen de nadelen.

----
(voorbeeld 2) Lijkt me nergens voor nodig; lijkt me nergens goed voor.

----

Over het algemeen kies ik voorbeeld 1.

----

Maar laat me toch voorbeeld 4 geven: heredoc notatie.

Voorbeeld:
<?php
if(isset($_POST['a'])){
echo <<<HTML
<div>
<span class="uitleg">De foto's zijn klaar</span>
<span class="uitleg">Merk op dat ik nergens problemen krijg met speciale tekens zoals ' of "</span>
</div>
HTML;
}
?>

Een aantal voordelen:
- je hebt geen probleem met ' of " tussen de HTML.
- Kijk naar de indentering. Bij jouw voorbeeld 1 start jouw eerste Hallo op 7 karakters van de rand, terwijl het tweede lijntje op 1 karakter van de rand staat.
Ik heb dit niet. De string begint pas bij het lijntje onder de <<< en eindigt de lijn boven het afsluitend teken.
Ik zou hier de PSR-2 Coding Style Guide volgen:

<?php
if (isset($_POST['a'])) {
    echo 'Hallo,<br>dit is<br>een test.';
}
?>

Waar de leesbaarheid van de output mogelijk belangrijker is dan de leesbaarheid van de code, zou ik teksten per zin opbouwen, bijvoorbeeld:

<?php
if (isset($_POST['a'])) {
    echo 'Hallo ', $voornaam, ',';
    echo 'Dit is een test.';
}
?>

Eén echo is hier voldoende, dus dit kan ook:
<?php
if (isset($_POST['a'])) {
echo 'Hallo ', $voornaam, ',',
'Dit is een test.';
}
?>
[/code]

Mijn mening:

Deze strookt grotendeels met die van Frank en Ozzie.
Als je goed onderscheid maakt tussen PHP code en de HTML (view), krijg je binnen de HTML beperkt een echo van een PHP variabelen.
Als je hele lapppen HTML hebt, weet je ook niet meer waar je blijft als je dat gehele block gaat echoën.
Daarnaast kan je dan ook geen gebruik meer maken van de voordelen die de meeste IDE's bieden.

Ook dit is natuurlijk een persoonlijke mening ;-)
Voor simpele site's voldoet voorbeeld 3. Een flexibelere oplossing (en ook hoe meeste sites het doen) is het splitsen van PHP code en HTML output.

Hier heb je enkele template engines voor. Ik raad Twig aan, maar je kunt ook bijvoorbeeld smarty gebruiken (niet aangeraden :P)

Wil je echter snel beginnen en heb je geen ervaring met 3rd part libraries te includen kan dit gewoon met PHP.

Klein voorbeeldje:


<?php

// functions.php of iets dergelijks

function renderTemplate($templateFile, array $variables, $templateDir = 'templates/') {
  extract($variables);
  include($templateDir . $templateFile . '.php');
}

// index.php

$templateVars = array();

if (isset($_GET['name'])) {
  $templateVars['name'] = htmlentities($_GET['name']);
}

renderTemplate('naam_tonen', $templateVars);

?>


En de template code:

// templates/naam_tonen.php

<html>
<?php if (isset($name)) { ?>
   <h1>je naam is: <?= $name ?></h1>
<?php } else { ?>
   <h1>Geen naam opgegeven!</h1>
<?php } ?>
</html>

Reageren