2009-11-19 6 views
6

Ich bin etwas verwirrt über wie der untenstehende Code funktioniert. In meinem Kopf stelle ich mir vor, dass jeder PHP-Block als Ganzes ausgeführt und in HTML gerendert wird. Die Tatsache, dass der erste Block mit einer hängenden Klammer unvollständig ist, spielt nicht gut mit dem, wie ich mir PHP vorstelle. Was macht das PHP-Modul, wenn es zu einem schließenden PHP-Tag kommt? Wie kann es sein, dass Code innerhalb der PHP-Tags die Ausgabe von Klartext außerhalb der PHP-Tags bewirken kann, d. H. Das Formular nur bedingt ausgeben?PHP bedingte gefolgt von Closing Tag

Ich hätte gedacht, dass, um das unten zu erreichen, Sie tatsächlich eine echo-Anweisung verwenden müssten, um die Form bedingt zu echo.

<html> 
<head></head> 
<body> 

<?php 
/* if the "submit" variable does not exist, the form has not been submitted - display initial page */ 
if (!isset($_POST['submit'])) { 
?> 

    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 
    Enter your age: <input name="age" size="2"> 
    <input type="submit" name="submit" value="Go"> 
    </form> 

<?php 
    } 
else { 
/* if the "submit" variable exists, the form has been submitted - look for and process form data */ 
    // display result 
    $age = $_POST['age']; 
    if ($age >= 21) { 
     echo 'Come on in, we have alcohol and music awaiting you!'; 
     } 
    else { 
     echo 'You're too young for this club, come back when you're a little older'; 
    } 
} 
?> 

</body> 
</html> 

Antwort

4

Die PHP manual erklärt es ziemlich anständig:

... wenn PHP die ?> Endtags trifft, es ist einfach alles ausgibt, es findet (mit Ausnahme eines unmittelbar Newline folgenden - Anweisung Trennung sehen), bis er trifft eine andere Starttag ... aber für große Textblöcke Ausgabe von PHP-Parsing-Modus fallen in der Regel effizienter als der gesamte Text durch echo() oder print() ...

3

Die Teile außerhalb der PHP-Tags werden als Literale behandelt, die in diesem Teil des Programmablaufs ausgegeben werden.

2

Wenn die Bedingung fehlschlägt, springt sie zum Ende geschweifte Klammern innerhalb des PHP-Blocks. Alles andere wird als ein Literal betrachtet, das direkt auf die Seite führt (im Gegensatz dazu, als Code betrachtet zu werden).

0

PHP-Entwickler stoßen häufig auf das Problem mit dem Senden von Kopfzeilen und Cookies, nachdem die Ausgabe an den Browser gesendet wurde. Dieses Problem kann jedoch auch bei einer unbeabsichtigten Ausgabe auftreten. Wenn Leerzeichen nach dem Ende eines PHP-Codeblocks eingefügt werden, kann dies zu unbeabsichtigten Ausgaben führen, wenn dieses PHP-Skript enthalten ist.

Quelle: http://phpstarter.net/2009/01/omit-the-php-closing-tag/

3

Denken Sie daran, in umgekehrter Richtung. Das ganze Dokument ist PHP, mit einem impliziten? > am Anfang und eine implizite <? ganz am Ende. Dann erhalten Sie diese Äquivalenzen:

?>HTML TAGS<? 

werden äquivalent zu

echo 'HTML TAGS'; 

Mit anderen Worten, jedes invertierten Paar PHP zum Öffnen/Schließen Klammer kapselt eine Echo-Anweisung.

+1

Es ist irgendwie ein schlechtes Verständnis, um in den Kopf zu kommen, tatsächlich. Mehr wie - Daten außerhalb von PHP-Tags werden nicht ausgewertet, sind aber immer noch Teil aller Kontrollflussanweisungen. –

+1

Vielleicht aus der Sicht eines Drehbuchautors. Vor 10 Jahren habe ich eine PHP-ähnliche Programmierumgebung erstellt, und genau so ist der Compiler/Interpreter implementiert. Aus der Perspektive eines Compiler-Autors ist das ein ziemlich gutes Verständnis dafür, wie die Dinge funktionieren. Daten werden nur unter besonderen Umständen wie doppelten Anführungszeichen ausgewertet. Es ist wirklich schlecht, an Daten zu denken, die eher allgemein als nur unter besonderen Umständen ausgewertet werden. – Killroy

0

+1 Bernard Antwort zu senden.

Sie können diese aussehen lassen weniger seltsam/gebrochen durch Ihre Templat-Ebene Kontrollstrukturen wie wohlgeformte Tags, zB .:

<?php if (!isset($_POST['submit'])) { ?> 
    <form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>"> 
     <label for="age">Enter your age:</label> 
     <input name="age" id="age"> 
     <input type="submit" name="submit" value="Go"> 
    </form> 
<?php } else { ?> 
    <?php 
     // Read submitted age 
     // 
     $age= intval($_POST['age']); 
    ?> 
    <?php if ($age >= 21) { ?> 
     Come on in, we have alcohol and music awaiting you! 
    <?php } else { ?> 
     You're too young for this club, come back when you're a little older. 
    <?php } ?> 
<?php } ?> 

Notiere die htmlspecialchars um die $_SERVER['PHP_SELF']; - dies war eine Cross-Site -scripting loch im Beispielcode. Außerdem gab es ein offensichtliches Problem mit den Apostrophen in der letzten echo.

+0

Persönlich finde ich, dass der Code viel lesbarer wird, wenn kurze Tags aktiviert sind. Dies ermöglicht auch diese syntaktische Abkürzung: Killroy

+0

Ja, nur diese Abkürzung lässt die wichtigen 'htmlspecialchars' weg, so dass es am Ende nicht so kurz ist. Ich stimme zu, dass kurze Tags lesbarer sind, aber es sieht so aus, als wären sie auf dem Weg nach draußen. Die Idee, PHP in XML-Verarbeitungsanweisungen zu verschieben, war eine gute Idee, aber da sie leider keine Möglichkeit bieten, Attributwerte zu injizieren, können Sie immer noch nicht PHP schreiben, das auch wohlgeformtes XML ist. Am Ende hat sich der Wechsel zu Long-Tag-PIs als ziemlich sinnlos herausgestellt. – bobince