2009-11-19 3 views
6

Я как-то смущен насчет как работает ниже. В моей голове я представляю, как каждый блок php выполняется в целом и передается в HTML. Тот факт, что первый блок является неполным с висячей скобой, не очень хорошо сочетается с тем, как я могу представить PHP для работы. Что делает модуль PHP, когда он попадает в тег закрытия PHP? Как этот код внутри тегов PHP может влиять на вывод открытого текста вне тегов PHP, т. Е. Только условно выводит форму?PHP Условный, за которым следует Закрывающий тег

Я бы подумал, что для достижения ниже вам действительно нужно было бы использовать эхо-инструкцию для условного эхо-формы.

<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> 

ответ

4

PHP manual объясняет это довольно прилично:

... когда PHP хитов ?> закрывающих тегов, он просто начинает выводить все, что он находит (кроме для сразу после перехода на новую строку - см разделения команд), пока он не достигнет другой открывающий тег ... но для вывода больших блоков текста, выпадающий из режима разбора PHP обычно более эффективен, чем отправка всего текста через echo() или print() ...

3

Части, находящиеся за пределами тегов php, рассматриваются как литералы, которые выводятся в этой части потока программы.

2

Если условие не выполнено, оно пропускает до конца фигурные скобки внутри блока php. Все остальное считается литералом, который идет прямо на страницу (в отличие от рассматриваемого кода).

0

PHP-разработчики часто сталкиваются с проблемой отправки заголовков и файлов cookie после отправки вывода в браузер, но эта проблема также может возникать при непреднамеренном выходе. Если пробел вставлен после окончания кода кода PHP, это может привести к непреднамеренному выводу, когда этот PHP-скрипт включен.

Источник: http://phpstarter.net/2009/01/omit-the-php-closing-tag/

3

Think его в обратном направлении. Весь документ PHP, с неявным? > в начале и неявный <? в самом конце. Тогда вы получите эти эквивалентности:

?>HTML TAGS<? 

становится эквивалентным

echo 'HTML TAGS'; 

Другими словами, каждая из перевернутого пары открытия PHP/закрытия скобки инкапсулирует эхо заявление.

+1

На самом деле это плохое понимание, чтобы попасть в голову. Более того - данные за пределами php-тегов не оцениваются, но все еще являются частью всех операторов потока управления. –

+1

Возможно, перспектива писателя сценария. 10 лет назад я создал PHP-подобную среду программирования, и именно так реализован компилятор/интерпретатор. С точки зрения компилятора-писателя это довольно хорошее понимание того, как все работает. Данные оцениваются только при особых обстоятельствах, таких как двойные кавычки. Очень плохо думать, что данные оцениваются в целом, а не только в особых обстоятельствах. – Killroy

0

+1 ответ Бернард.

Вы можете сделать это выглядеть менее странно/сломана, используя свои структуры управления шаблонный уровня, как хорошо сформированные теги, например .:

<?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 } ?> 

Обратите внимание на htmlspecialchars вокруг $_SERVER['PHP_SELF']; - это кросс-сайт -программирующее отверстие в примере кода. Плюс была очевидная проблема с апострофами в последних echo.

+0

Лично я считаю, что код становится более читаемым с включенными короткими тегами. Это также позволяет использовать этот синтаксический короткий отрезок: <входное значение = ""> – Killroy

+0

Да, только этот короткий отрезок пропускает жизненно важные «htmlspecialchars», поэтому он не так короток в конце. Я согласен с тем, что короткие теги более читабельны, но похоже, что они всегда на пути. Идея переноса PHP на XML Processing Instructions была хорошей, но, к сожалению, поскольку они не дают возможности вводить значения атрибутов, вы все равно не можете писать PHP, который также является хорошо сформированным XML. Таким образом, переход к «длинным меткам» PI оказался совершенно бессмысленным. – bobince