PHP tags

When PHP parses a file, it looks for opening and closing tags, which are
<?php and ?> which tell PHP to
start and stop interpreting the code between them. Parsing in this manner
allows PHP to be embedded in all sorts of different documents, as
everything outside of a pair of opening and closing tags is ignored by the
PHP parser.

PHP also allows for short open tag <? (which is
discouraged since it is only available if enabled using the
short_open_tagphp.ini
configuration file directive, or if PHP was configured with the
--enable-short-tags
option).

If a file is pure PHP code, it is preferable to omit the PHP closing tag
at the end of the file. This prevents accidental whitespace or new lines
being added after the PHP closing tag, which may cause unwanted effects
because PHP will start output buffering when there is no intention from
the programmer to send any output at that point in the script.

<?phpecho "Hello world";

// ... more code

echo "Last statement";

// the script ends here with no PHP closing tag

Changelog

Version

Description

7.0.0

The ASP tags <%, %>,
<%=, and the script tag
<script language="php"> are removed from PHP.

5.4.0

The tag <?= is always available regardless of the short_open_tag ini setting.

User Contributed Notes 3 notes

> 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/*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 /*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.