Was ist der beste Weg, um HTML über PHP einzufügen?
Lesezeit: 7 Minuten
Brayn
Was ist Ihrer Meinung nach der beste Weg, um HTML mit PHP einzufügen? Im Moment verwende ich eine der folgenden Methoden (meistens letztere), aber ich bin neugierig zu wissen, welche Ihrer Meinung nach am besten ist.
Wenn Sie die Dinge auf diese Weise tun, möchten Sie Ihre Logik und Ihr Design trennen, das stimmt.
Dazu müssen Sie Smarty jedoch nicht verwenden.
Im Vordergrund steht die Denkweise. Ich habe gesehen, wie Leute in Smarty schockierende Dinge getan haben, und es verwandelt sich schließlich in Leute, die Websites entwickeln in Smarty, und dann wird ein heller Funke entscheiden, dass sie eine Template-Engine in Smarty schreiben müssen (unterschätzen Sie niemals das Potenzial einer dummen Idee).
Wenn Sie Ihren Code in zwei Teile aufteilen und sich dazu zwingen, sich an einen Standard zu halten, erhalten Sie eine viel bessere Leistung.
PageLogic.php
<?php
$pageData = (object)(array()); // Handy trick I learnt.
/* Logic Goes here */
$pageData->foo = SomeValue;
ob_start();
require("layout.php");
ob_end_flush();
PHP wurde als Templating-Engine geschrieben, also sollten Sie es zumindest tun Versuchen um es für die vorgesehene Aufgabe zu verwenden, bevor Sie beurteilen, ob Sie sich mit Smarty befassen müssen oder nicht.
Wenn Sie sich für die Verwendung einer Templating-Engine entscheiden, versuchen Sie außerdem, sich eine zu besorgen, die HTML umgeht Ursprünglich und Sie “abmelden” statt “anmelden”. Sie ersparen sich eine Menge XSS-Kopfschmerzen. Smarty ist in dieser Hinsicht schwach, und aus diesem Grund sind viele inhaltsnaive Vorlagen darin geschrieben.
So gehen Smarty-Vorlagen im Allgemeinen. Das Problem ist, dass $dangerous_value beliebiger HTML-Code sein kann und dies nur zu sogar führt mehr schlechte Codierungspraktiken mit nicht nachvollziehbarem Spaghetti-Code überall.
Jede Vorlagensprache, die Sie in Betracht ziehen sollte gehen auf dieses Anliegen ein. z.B:
Auf diese Weise sind Ihre potenziellen Eingänge zur Ausbeutung in der Vorlage leicht erkennbar, im Gegensatz zum Eingang zur Ausbeutung URSPRÜNGLICH Verhalten.
Sie können auch $pageData = new stdClass(); ausführen, was dasselbe ist wie (object)(array());
– Tom Haigh
5. November 2008 um 22:41 Uhr
@tom, ja, seltsamerweise ist die (Objekt-)Notation etwas schneller :). Warum das so ist, weiß ich allerdings nicht.
– Kent Fredric
5. November 2008 um 22:52 Uhr
1060.000 Mal/Sek. vs. 819.000 Mal/Sek.
– Kent Fredric
5. November 2008 um 22:54 Uhr
Das ist wirklich wichtig für eine durchgeführte Aufgabe einmal pro Seitenanforderung. Die Notation 😀 (Objekt) ist seltsam und wahrscheinlich den meisten PHP-Entwicklern nicht bekannt.
– Wadim Ferderer
20. Januar 2009 um 0:41 Uhr
Die eigentliche Ironie ist, dass ich die (Objekt-) Notation vor der Notation ‘new stdClass’ entdeckt habe.
– Kent Fredric
30. April 2009 um 20:35 Uhr
-1 für den typischen hysterischen Gebrauch [my favourite templating system] stattdessen!’ Beiträge. Jeder PHP-Beitrag, auch wenn die native PHP-Antwort ein Einzeiler ist, degeneriert immer dazu, genauso wie jede Einzeiler-JavaScript-Frage voller Nutzen endet [my favourite framework] stattdessen!’. Es ist peinlich.
Im Ernst, wir kennt über die Trennung von Geschäftslogik und Darstellungsbelangen. Das können Sie tun – bzw nicht mach das — in jedem Templating-System, ob PHP, Smarty oder etwas ganz anderes. Kein Templating-System trennt Ihre Anliegen auf magische Weise ohne viel Nachdenken.
(Tatsächlich kann ein zu restriktives Templating-System dazu führen, dass Sie Hilfscode schreiben müssen, der nur der Präsentation dient, und Ihre Geschäftslogik mit Präsentationsbedenken überladen. Das ist kein Gewinn!)
Um die gestellte Frage zu beantworten, das erste Beispiel ist in Ordnung, aber aufgrund der schlechten Einrückung sehr schwer zu lesen. Sehen Sie sich das Beispiel von monzee für eine lesbarere Weise an; Sie können die :-Notation oder {}s verwenden, je nachdem, was Sie bevorzugen, aber das Wichtigste für die Lesbarkeit ist, dass Sie Ihr HTML und PHP als eine einzelne, „wohlgeformte“ eingerückte Hierarchie beibehalten.
Und eine letzte Bitte: Denken Sie an htmlspecialchars(). Jedes Mal, wenn einfacher Text auf einer Webseite eingegeben werden muss, ist dies muss verwendet werden, oder es ist XSS auf dem ganzen Boden. Ich weiß, dass diese Frage nicht direkt damit zusammenhängt, aber jedes Mal, wenn wir Beispielcode veröffentlichen, der < ?php echo($title) ?> oder ein Framework-Äquivalent ohne das Escaping enthält, ermutigen wir die Fortsetzung des Sicherheitskatastrophenbereichs that die meisten PHP-Apps sind geworden.
Ich stimme durchaus zu, dass Sie keine Templating-Engine benötigen, aber die Frage nach Best Practices, und eine der wichtigsten ist die Trennung von Geschäftslogik und Präsentation. Sie wissen vielleicht alles über sie, aber das bedeutet nicht, dass das Poster es tut.
– Ken
4. November 2008 um 12:15 Uhr
Ich schreibe meine Antworten immer so, dass ich davon ausgehe, dass der Poster es nicht weiß und noch wichtiger, dass viele zukünftige Leser dieses WIKI es nicht wissen werden!
– Markus
4. November 2008 um 13:12 Uhr
Ken
Die wichtigste Überlegung ist, die Logik von der Präsentation getrennt zu halten – weniger Kopplung macht zukünftige Änderungen an beiden viel einfacher.
Vielleicht möchten Sie sogar erwägen, eine Art Templating-System wie z schlau.
Die Links wurden entfernt.
– Malus Jan
2. August 2016 um 20:39 Uhr
@MalusJan Danke, ich habe die Links zu den gelöschten Fragen entfernt. Aber im Allgemeinen (vorausgesetzt, Sie haben Bearbeitungsrechte) dann gehen Sie einfach weiter und bearbeiten Sie – niemand wird etwas dagegen haben!
– Ken
5. August 2016 um 10:40 Uhr
Für einen sehr einfachen Fall wie diesen ist es in Ordnung, PHP als Vorlage zu verwenden. Wenn Sie jedoch über einfache Logik hinausgehen (und das werden Sie höchstwahrscheinlich tun), ist es eine gute Idee, Template-Engines zu verwenden.
In Zend Framework, das standardmäßig PHP-Ansichtsskripte verwendet, wäre die empfohlene Vorgehensweise wie folgt:
<?php if ($a) : ?>
[MARKUP HERE]
<?php else : ?>
[SOME MORE MARKUP]
<?php endif ?>
Die ausführlichere Syntax macht es viel einfacher, bedingte Blöcke auf einen Blick abzugleichen, als die Verwendung von geschweiften Klammern.
Weder. Verwenden Schlau. Indem Sie Ihre interne Logik von der Anzeigelogik trennen, erstellen Sie Code, der viel einfacher zu warten ist. (Nehmen Sie nicht den Weg des alten Template-Systems von PHPLib, das versuchte, PHP und HTML vollständig zu trennen – es erfordert, dass die Anzeigelogik mit Ihrer Kerngeschäftslogik vermischt wird, und ist sehr chaotisch.) Wenn Sie unbedingt HTML-Snippets in Ihrem PHP-Code generieren müssen , verwenden Sie Ihre zweite Methode, aber übergeben Sie die Variable an Smarty.
Sie brauchen Smarty nicht, um “Ihre interne Logik von der Anzeigelogik zu trennen”. PHP kann das nativ hervorragend.
– Verärgerte Ziege
9. Juni 2009 um 17:12 Uhr
Gemeinschaft
Es ist besser, Ihre Logik (PHP-Code) vollständig von der Präsentation (HTML) zu trennen, indem Sie eine Template-Engine verwenden.
Es ist schnell und einfach, PHP in HTML einzufügen, aber es wird sehr schnell chaotisch und ist sehr schwierig zu warten. Es ist ein sehr schnell u sehr schmutzige Herangehensweise …
Welche der in PHP verfügbaren Template-Engines besser ist, sehen Sie sich zum Beispiel diese Fragen an:
PHP-Vorlagen – mit PHP
Sichere PHP-Template-Engines
Sie brauchen Smarty nicht, um “Ihre interne Logik von der Anzeigelogik zu trennen”. PHP kann das nativ hervorragend.
– Verärgerte Ziege
9. Juni 2009 um 17:12 Uhr
neu242
Wenn Ihnen eine Template-Engine zu umständlich erscheint, können Sie Ihre eigene Template-Engine für den armen Mann erstellen. Dieses Beispiel sollte unbedingt verbessert werden und ist nicht für alle Aufgaben geeignet, aber für kleinere Sites vielleicht geeignet. Nur damit Sie sich ein Bild machen können:
template.inc:
<html><head><title>%title%</title></head><body>
%mainbody%
Bla bla bla <a href="https://stackoverflow.com/questions/261338/%linkurl%">%linkname%</a>.
</body></html>
Nein nein Nein! Sie verwenden keine regulären Ausdrücke, warum verwenden Sie preg_replace? Verwenden Sie stattdessen str_replace, es ist viel schneller.
– Verärgerte Ziege
9. Juni 2009 um 17:16 Uhr
10553500cookie-checkWas ist der beste Weg, um HTML über PHP einzufügen?yes