php[world] 2019 — 25 years of PHP

Теги PHP

Когда PHP обрабатывает файл, он ищет открывающие и закрывающие теги, такие как <?php и ?>, которые указывают PHP, когда начинать и заканчивать обработку кода между ними. Подобный способ обработки позволяет PHP внедряться во все виды различных документов, так как всё, что находится вне пары открывающих и закрывающих тегов, будет проигнорировано парсером PHP.

PHP также допускает короткий открывающий тег <?, однако использовать их нежелательно, так как они доступны только если включены с помощью конфигурационной директивы php.ini short_open_tag, либо если PHP был сконфигурирован с опцией --enable-short-tags .

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

echo "Hello world";

// ... еще код

echo "Последнее выражение";

// Скрипт заканчивается тут без закрывающего тега PHP

Список изменений
Версия Описание
7.0.0 ASP-теги <%, %>, <%=, и теги скриптов <script language="php"> удалены из PHP.
5.4.0 Тег <?= доступен всегда, вне зависимости от настройки short_open_tag.

add a note add a note

User Contributed Notes 4 notes

crazytonyi at gmail dot com
3 years ago
Regarding earlier note by @purkrt :

> I would like to stress out that the opening tag is "<?php[whitespace]", not just "<?php"

This is absolutely correct, but the wording may confuse some developers less familiar with the extent of the term "[whitespace]".

Whitespace, in this context, would be any character that generated vertical or horizontal space, including tabs ( \t ), newlines ( \n ), and carriage returns ( \r ), as well as a space character ( \s ). So reusing purkrt's example:

<?php/*blah*/ echo "a"?>

would not work, as mentioned, but :

<?php /*php followed by space*/ echo "a"?>

will work, as well as :

/*php followed by end-of-line*/ echo "a"?>

and :

<?php    /*php followed by tab*/ echo "a"?>

I just wanted to clarify this to prevent anyone from misreading purkrt's note to mean that a the opening tag --even when being on its own line--required a space ( \s ) character. The following would work but is not at all necessary or how the earlier comment should be interpreted :

/*php followed by a space and end-of-line*/ echo "a"?>

The end-of-line character is whitespace, so it is all that you would need.
kuzawinski dot marcin at gmail dot com
1 month ago
New lines placed after PHP closing tags are ignored;

<?= "A"?>
<?= "C"?>

Mark Clements (
1 year ago
Closing PHP tags are recognised within single-line comments:

// Code will end here ?> This is output as literal text.

# Same with this method of commenting ?> This is output as literal text.

However they do not have an effect in C-style comments:

/* Code will not end here ?> as closing tags are ignored inside C-style comments. */
pl at dot pl
4 months ago
Omit closing tag ?> always whenever you can

<!DOCTYPE html><head>
<title><?php include'varia.php'; echo$title?></title>

= 'Welcome';
[new line]        //other words: an extra 'Enter' is guilty

and you get:

Welcome - at the browser label

source won't tell you what happened - there will be fine:

<!DOCTYPE html><head>

Now imagine, what else can go wrong because of it? Everything, as Murphy said.
And you will look for the answer why...? And where...?
It's just simplest example.
To Top