Tach!
Verstehe. Aber was tue ich, wenn ich z.B. HTML-Code wie diesen:
Ich fahre am besten, indem ich generell für PHP-Code die einfachen Anführungszeichen verwende. Nur in Situationen, in denen ich eine Variablenauflösung oder Escapesequenz ( wie \n
) brauche, verwende ich als Ausnahme die doppelten.
<input type='hidden' name='message_v' value='$message_v' />
an eine Variable übergeben möchte, muss ich ihn ja in Anführungszeichen setzen, also so:
$meineVariable="<input type='hidden' name='message_v' value='$message_v' />"
Womit ich beide Arten von Anführungszeichen benötige, oder nicht?
Diese Situation kommt nicht vor, weil dabei der Kontextwechsel nicht beachtet wird.
$meineVariable = '<input type="hidden" name="message_v" value="' .
htmlspecialchars($message_v) . '" />';
Der Kontextwechsel sollte immer direkt an Ort und Stelle beachtet werden, damit man sieht, dass er nicht vergessen wurde.
Somit löst sich die Variablenauflösung in Wohlgefallen auf und mit dieser die Notwendigkeit der doppelten Anführungszeichen. Aber: Der Code ist nun nicht mehr einfach lesbar, weil der String zusammengestückelt wird. Abhilfe kann sprintf()
schaffen.
$meineVariable = sprintf('<input type="hidden" name="message_v" value="%s" />',
htmlspecialchars($message_v));
Aber auch das ist noch nicht der Weisheit letzter Schluss. Welcher zwingender Grund besteht denn, den HTML-Code in einer Variable haben zu wollen? Wenn man sich an das EVA-Prinzip (Eingabe → Verarbeitung → Ausgabe) hält, ist die Ausgabe kein Teil der Verarbeitung. Sie kommt am Ende und kann direkt erfolgen.
// Ende der Verarbeitung
?>
...
<form ...>
...
<input type="hidden" name="message_v" value="<?=htmlspecialchars($message_v))" />
...
</form>
...
Damit erübrigen sich die Anführungszeichen von selbst. Außerdem ist der HTML-Code nun nicht mehr in einem String versteckt. Eine Menge Editoren und IDEs können nun auch mit Syntaxhervorhebung und weiterer Unterstützung dienen, weil sie den HTML-Code als solchen erkennen können und nicht nur als beliebige Daten sehen.
Abschließend ist noch zu sagen, dass man auch im Ausgabeteil Logik benötigt. Zum Beispiel weil man Array-Daten in einer Schleife ausgeben möchte, oder weil eine Bedingung unterschiedliche Ausgaben benötigt. Wenn die Bedingung komplex zu ermitteln ist, steht sie im V-Teil und wird als einfacher Wert (z.B. true/false) an den Ausgabeteil gegeben. Im Ausgabeteil selbst steht hauptsächlich HTML-Code. Für die benötigten Kontrollstrukturen der Logik (if/for) wird stellenweise wieder in den PHP-Modus gewechselt. Man kann dabei die alternative Syntax für Kontrollstrukturen verwenden, aber das ist Geschmackssache.
Beispiel:
<?php if ($errors) { ?>
<p>Verarbeitung fehlgeschlagen. Gründe:</p>
<ul>
<?php foreach ($errors as $error) { ?>
<li><?= htmlspecialchars($error) ?></li>
<?php } ?>
</ul>
<?php } else { ?>
Ausgabe der Daten, wenn kein Fehler auftrat
<?php } ?>
oder in alternativer Syntax:
<?php if ($errors): ?>
<p>Verarbeitung fehlgeschlagen. Gründe:</p>
<ul>
<?php foreach ($errors as $error): ?>
<li><?= htmlspecialchars($error) ?></li>
<?php endforeach; ?>
</ul>
<?php else: ?>
Ausgabe der Daten, wenn kein Fehler auftrat
<?php endif; ?>
dedlfix.