2009-02-03 17 views
40

In Bezug auf die Leistung, was wäre besser. Mit PHP, um die gesamte HTML-Ausgabe zu echo, so dass ich es mit den verschiedenen Bits von Arbeits-Code und Variablen pfeffern kann oder HTML zu php regelmäßig in den Dokumenten entkommen kann.Escape HTML zu PHP oder Echo verwenden? Welches ist besser?

Ich weiß, dass es einige Lesbarkeitsprobleme geben kann, aber ich bin nicht besorgt darüber.

Vielen Dank!

Beispiel 1

echo '<html>', 
    '<body>', 
    'The content of the ',$container,' element is displayed in your ', $other_container, 
    '</body>', 
    '</html>'; 

OR

<html> 
<body> 
The content of the <?php echo $container; ?> element is displayed in your <?php echo $other_container; ?> 
</body> 
</html> 
+1

Ihren Code für Sie behoben. In der Zukunft Code Code 4 Leerzeichen um stackoverflow zu bekommen, um es als Code zu erkennen :) –

+0

zweites Beispiel ist der Weg zu gehen. alles andere ist ein Code-Geruch. keine ernsthafte Person würde nicht zustimmen –

Antwort

33

Es ist alles, was Sie am besten finden. Natürlich wird dies mit jeder Situation variieren. Wenn Sie eine ganze Seite machen würden und es große Bereiche gäbe, in denen es kein PHP gäbe, würde ich aus PHP ausbrechen und einfach nur das einfache HTML schreiben, wenn es einen Abschnitt mit vielen PHP-Variablen gäbe Ich würde alles in PHP machen.

Zum Beispiel:

<table> 
    <tr> 
     <td colspan="<?php echo $numCols; ?>"> 
      <?php echo $a; ?>, <?php echo $b; ?>, and <?php echo $c?> 
     </td> 
    </tr> 
</table> 

gegen:

<?php 
echo "<table>" 
    . "<tr>" 
    . "<td colspan=\"" . $numCols . "\">" 
    .  $a . ", " . $b . " and " . $c 
    . "</td>" 
    . "</tr>" 
    . "</table>" 
; ?> 

Oder

<?php 
echo "<table> 
     <tr> 
      <td colspan='{$numCols}'> 
       {$a}, {$b}, and {$c} 
      </td> 
     </tr> 
     </table>"; 
?> 

Vergessen Sie auch nicht über printf

<?php 
printf("<table>" 
    . "<tr>" 
    . "<td colspan=\"%d\">%s, %s and %s</td>" 
    . "</tr>" 
    . "</table>" 
    , $numCols 
    , $a 
    , $b 
    , $c 
); 
?> 
+1

Ich las die ersten und stimmte nicht völlig zu. Ich stimme Ihrem Vorschlag viel mehr zu! Bleibe bei allem, was vorherrscht. – benlumley

+4

Sie vermisste heredoc;) – MarcinWolny

5

Es fällt in den Bereich der Mikro Optimierungen. Der größte Teil Ihrer Zeit liegt in der Initialisierung der PHP-Engine, die die Arbeit startet.

Also, es sei denn, Sie haben eine Bestellung von Zehntausenden von Zeilen (oder sogar mehr), sollten Sie sich nicht darum kümmern.

Um hinzuzufügen, habe ich einen kleinen Test von einer Million Zeilen, wo ich php verwendet, um sie zu drucken, und wo ich php verwendet, um ein c-Programm, das die gleiche Sache und der Unterschied war winzig.

Ein wenig mehr Info.

Was im zweiten Beispiel passiert ist, dass Sie PHP "ein-/ausschalten", es ist nicht genau was passiert, aber für dieses Beispiel passt es.

Die Sache, um die Sie sich sorgen sollten, ist, dass der Code eine Menge Logik dabei haben wird? Werde ich diese Saite in noch mehr Saiten aufteilen oder sie sogar an verschiedenen Stellen platzieren? Ist dies die Ansicht einer MVC-Anwendung?

Für 1 und 2 könnte es einen Weg zwischen beiden Methoden sein. Aber für 3 würde ich aus diesen Gründen mit Methode 2 gehen.

Eine Ansicht in einer MVC-Webanwendung ist meist HTML/CSS. Also ich will sehen, dass das richtig formatiert ist und ich möchte in meinem Editor die HTML-Färbung sehen. Das ist also ein Plus.

+0

Ich verstehe Ihren Punkt, aber ich würde immer noch gerne den Unterschied wissen. Vielen Dank. –

8

Es ist ziemlich irrelevant für die Gesamtgeschwindigkeit Ihrer App, mit der Sie gehen.

Das gesagt, ich weiß, dass Sie gesagt haben, dass es Ihnen egal ist, aber bitte verwenden Sie die zweite, da es etwa eine Million Mal leichter zu lesen ist. Und Lesbarkeit ist riesige.

30

Welches auch immer am einfachsten zu lesen ist.

Der Leistungsunterschied ist im Vergleich zu fast jedem anderen Problem vernachlässigbar. Definitiv Lesbarkeit ist hier die erste Ausgabe.

2

Für kleine Bits behalte ich alles in PHP-Strings, wie beim Durchlaufen eines Arrays, um eine Liste zu generieren. Aber für größere Stapel von Markups behalte ich das aus dem PHP heraus und lege es einfach bei Bedarf in PHP ab.

Dies ist weitgehend, weil ich es vorziehe, für Wartungsfreundlichkeit zu optimieren. Nicht nur weil es schneller ist zu sehen, was passiert, wenn das HTML eine entsprechende Syntax-Hervorhebung hat, sondern weil es auch Fehler macht, die aus einem fehlerhaften Lesen des Codes resultieren.

Es gibt wirklich keinen besten Weg. Ich versuche nur im Einklang mit dem oben Beschriebenen zu bleiben und halte meine Augen offen für Situationen, in denen der andere Weg vielleicht besser wäre.

22

Lassen Sie uns the manual zitieren:

Als Beispiel ist hier gekünstelt ist, natürlich, aber große Blöcke von Text, fallen aus PHP Parsing-Modus alle in der Regel mehr effizient ist zur Ausgabe als das Senden des Textes durch echo() oder print().


Aber bitte auf den anderen hören und diese Art von Mikro-Optimierung zu vermeiden und die wählen, die besser lesbar ist.

Kann ich eine dritte Lösung vorschlagen? Hast du schon von Template-Engines gehört? Sie helfen Ihnen dabei, eine klare Trennung zwischen Code und Präsentation zu erreichen, was normalerweise zu saubererem Code führt, der einfacher zu pflegen ist. Eine beliebte derartige Vorlagenmaschine ist z.B. smarty, aber es gibt Hunderte mit unterschiedlichen Stärken.

+0

Ich bin überrascht, dass jeder das Echo leichter finden würde, da die IDEs, die ich gefunden habe, die HTML-Formatierung in echoed html ignorieren. – Ishmael

+0

Plus 1 zum Zitieren des Handbuchs bezüglich der Leistung. – lowtechsun

1

Letzteres ist viel besser lesbar. Es ist auch einfacher zu bearbeiten (Sie müssen z. B. keine Anführungszeichen in HTML entfernen). Und es behält Whitespace ohne irgendeinen Aufwand bei, was insbesondere für Debugging-Zwecke bevorzugt werden kann.

Ich wünschte fast, PHP würde print() und echo() automatisch HTML-Zeichen konvertieren, so dass die Menschen aufhören würden, sie zu verwenden, um HTML zu generieren.

3

In Bezug auf die Leistung ... ist es nicht wichtig. Lesbarkeit des Codes ist König, ein winziger Bruchteil eines Prozents der Leistungsdifferenz wird nichts ändern.

Die rohe HTML-Version ist normalerweise am einfachsten zu lesen (und hat wahrscheinlich auch die beste Leistung für das, was es wert ist - aber was es wert ist: nichts). Dies ist keine Überraschung: PHP ist eine HTML-Templating-Sprache, die gesamte Punkt verschachtelt HTML auf einer Sprache Syntaxebene.

Sehen Sie sich den nickf-Code an, um zu sehen, wie er lesbar bleibt. Einrücken ist wichtig! Fügen Sie auch eine Ebene der Einrückung in jede PHP-Kontrollstruktur ein, damit Sie sie verfolgen können. z.B.:

<?php if ($error) { ?> 
    <p> Oh no, error! </p> 
<?php } ?> 

Schließlich, wenn Inhalte wie $ Container in Ihrem Beispiel ausgibt, müssen Sie immer htmlspecialchars() es, oder du wirst eine Anwendung voller HTML-Injektion Sicherheitslücken wie jede andere PHP-Neuling haben (und sogar viele professionelle Entwickler, leider). Dies ist unabhängig davon, welche Methode Sie zum Ausgeben von Inhalten verwenden.

Da htmlspecialchars ein ziemlich nervend lange Funktionsname ist, können Sie versuchen, Ihre eigene Abkürzung Funktion definieren:

<?php 
    function h($s) { 
     echo(htmlspecialchars($s, ENT_QUOTES)); 
    } 
?> 

<ul> 
    <?php foreach ($things as $thing) { ?> 
     <li> <?php h($thing['name']) ?> </li> 
    <?php } ?> 
</ul> 
8

ich über die Leistung nicht wissen, aber in PHP können Sie auch, was ich Glaube wird ein "Heredoc" genannt, was meiner Meinung nach mit Lesbarkeit innerhalb dieser Art von Output hilft.

Nickf Vorbild:

<table> 
    <tr> 
     <td colspan="<?php echo $numCols; ?>"> 
      <?php echo $a; ?>, <?php echo $b; ?>, and <?php echo $c?> 
     </td> 
    </tr> 
</table> 

wird:

<?php 
echo <<<EOT 
<table> 
    <tr> 
     <td colspan="$numCols"> 
      $a , $b, and $c 
     </td> 
    </tr> 
</table> 

EOT; 

?> 

Ich glaube, dass letztlich die Lesbarkeit eine subjektive Sache ist, so können Sie Ihre Laufleistung variieren!

Ruth

+1

Ich dachte, Heredoc war perfekt, aber es kann einen Vorbehalt geben, den man je nach Anwendungsfall beachten sollte. Wenn vor dem letzten EOT ein Leerraum ist, bricht alles zusammen. Es gibt eine Reihe von Gründen, warum dies unbeabsichtigt passieren kann. Sei dir dessen nur bewusst. – user1167442

1

Sie sollten ernsthaft in Betracht ziehen, PHP niemals in HTML zu platzieren. Sie mischen Logik mit Sicht, was ein Projekt unordentlich macht.

Wie andere gesagt haben, wenn Sie die Ausgabe in HTML, verwenden <?php echo $whatever; ?>

Wenn Sie zur Ausgabe einer Unmenge an Informationen in Ausgabepufferung suchen.

3

Code, als ob der nächste Programmierer, der das Projekt übernimmt, ein Serienmörder ist. Mit anderen Worten, verwenden Sie die zweite Option, die Sie erwähnt haben.

+1

Eine gute Regel zu folgen. – edude05

3

Dies sollte eher als Lesbarkeit und Wartung als ein Leistungsproblem betrachtet werden.

Somit Option 2 hat ein paar konkrete Vorteile:

  1. -Code Färbung. Bei Option 1 ist alles als Echo-Anweisung eingefärbt, was das Lesen von HTML erschwert.
  2. Intellisense - Bei vielen IDEs wird HTML in einer PHP-Echo-Anweisung nicht mit Intellisense interagieren, so dass Sie all dieses HTML von Hand eingeben werden.
2

Ich ziehe php heredoc Funktion zu nutzen, so brauche ich keine Zeichen zu entkommen, ex:

<?php 

$title = "heredoc is cool!!!"; 
$mySite = "http://www.php.net"; 

echo <<<LOL 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en"> 
<head> 

    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 

    <title> $title </title> 

<link rel="shortcut icon" href="$mySite/favicon.ico"> 
<link rel="search" type="application/opensearchdescription+xml" href="$mySite/phpnetimprovedsearch.src" title="Add PHP.net search"> 
<link rel="alternate" type="application/atom+xml" href="$mySite/releases/feed.php" title="PHP Release feed"> 
<link rel="alternate" type="application/atom+xml" href="$mySite/feed.atom" title="PHP: Hypertext Preprocessor"> 

<link rel="canonical" href="$mySite/manual/en/language.types.string.php"> 
<link rel="shorturl" href="$mySite/types.string"> 

<link rel="contents" href="$mySite/manual/en/index.php"> 
<link rel="index" href="$mySite/manual/en/language.types.php"> 
<link rel="prev" href="$mySite/manual/en/language.types.float.php"> 
<link rel="next" href="$mySite/manual/en/language.types.array.php"> 
LOL; 
?> 

Hinweis:

Heredoc Text verhält sich wie ein Doppel -Quote, ohne die doppelten Anführungszeichen. Dies bedeutet, dass Anführungszeichen in einem Heredoc nicht Escape sein müssen, aber die oben aufgeführten Escape-Codes können weiterhin verwendet werden. Variablen werden erweitert, aber die gleiche Sorgfalt gilt, wenn komplexe Variablen innerhalb eines Heredocs wie bei Strings ausdrücken.

Verwandte Themen