Question
I read in the PHP documentation that PHP supports multiple opening and closing tag styles:
<?php ?>
<script language="php"></script>
<? ?>
<% %>
According to the documentation, <?php ?> and <script language="php"></script> are always available, while short tags and ASP-style tags can be enabled or disabled through php.ini. Because of that, the documentation says they are less portable and generally not recommended.
In practice, I often see servers with short tags enabled. Writing:
<?= $value ?>
or even:
<? echo $value; ?>
feels more convenient than writing:
<?php echo $value; ?>
Since developer convenience matters, why are PHP short tags generally not recommended, and when is it acceptable to use them?
Short Answer
By the end of this page, you will understand what PHP short tags are, why portability matters more than a few saved keystrokes, and why <?php ... ?> is usually the safest choice. You will also learn the special case of <?= ... ?>, how teams handle PHP tags in real codebases, and what to avoid in production code.
Concept
PHP code is embedded inside files using opening and closing tags. The most common and safest form is:
<?php
// PHP code here
?>
Historically, PHP also supported shorter alternatives such as:
<?
// PHP code
?>
and shorthand output tags such as:
<?= $name ?>
The core issue is portability. A portable PHP file works the same way across different servers and configurations. Short open tags like <? depend on server configuration in older PHP environments, so code that works on one machine may fail on another.
That is why <?php is recommended:
- It is explicit.
- It is always recognized.
- It avoids configuration surprises.
- It makes the file clearly identifiable as PHP.
This matters in real programming because code is rarely written for just one machine. It may run on:
- a local development environment
- a teammate's laptop
- a staging server
- a production server
- a CI pipeline
- a shared hosting environment
If one of those environments disables short tags, code using <? may break or output raw PHP source as plain text.
Mental Model
Think of PHP tags like power plug shapes.
<?phpis the standard plug that works everywhere.<?is a special plug adapter that only works in places where the outlet is configured for it.<?=is a compact switch used for one very specific job: outputting a value.
If you are building something only for your own desk, you might accept a special adapter. But if you want your code to travel safely between machines and teams, you use the standard plug.
Saving a few keystrokes is helpful, but reliability usually matters more than typing speed in shared or long-lived code.
Syntax and Examples
The main PHP tag styles you may encounter are:
<?php
$name = "Ava";
echo $name;
?>
Short open tag:
<?
$name = "Ava";
echo $name;
?>
Short echo tag:
<?= $name ?>
Recommended syntax
Use <?php for normal PHP blocks:
<?php
$total = 10;
$tax = 2;
echo $total + $tax;
Use <?= only when you want to print a value directly, especially in view templates:
<p>Hello, <?= () </p>
Step by Step Execution
Consider this example:
<?php
$product = "Notebook";
$price = 12;
?>
<p>Product: <?= htmlspecialchars($product) ?></p>
<p>Price: $<?= $price ?></p>
Step by step:
- PHP enters the
<?phpblock. $productis assigned the string"Notebook".$priceis assigned the number12.- The
?>closes the PHP block. - The HTML
<p>Product:is sent to the browser. <?= htmlspecialchars($product) ?>printsNotebook.- The closing
</p>is sent. - The second paragraph starts.
$is plain text in the HTML output.<?= $price ?>prints .
Real World Use Cases
PHP tags appear most often in these situations:
1. Rendering HTML templates
<h2><?= htmlspecialchars($article['title']) ?></h2>
Useful for outputting small values inside markup.
2. Building server-rendered pages
<?php if ($isLoggedIn): ?>
<a href="/logout">Logout</a>
<?php else: ?>
<a href="/login">Login</a>
<?php endif; ?>
This uses standard PHP tags for control flow in templates.
3. Legacy PHP applications
Older codebases may contain many <? tags because they were written when that style was common.
4. Shared hosting or mixed environments
Portability is critical here. A project may move between hosts with different PHP configurations, so <?php avoids breakage.
5. CMS themes and view files
In template-heavy code, <?= is often used because it is short and readable for output-only expressions.
Real Codebase Usage
In real projects, teams usually follow simple rules:
Common team conventions
- Use
<?phpfor all PHP code blocks. - Allow
<?=in templates if the project supports modern PHP. - Avoid
<?completely. - Never rely on environment-specific parser settings unless the whole platform is controlled.
Why teams prefer explicit tags
Reliability
A repository should run the same way everywhere.
Readability
<?php is unmistakable. Someone scanning the file immediately knows a PHP block starts there.
Tooling support
Linters, formatters, code style tools, and IDEs work best with standard syntax.
Common patterns in codebases
View rendering
<li><?= htmlspecialchars($item['name']) ?></li>
Guarded output
<?php if (!isset($user)): ?>
<p>Guest user</p>
:
<p> ([]) </p>
;
Common Mistakes
1. Using <? and assuming it works everywhere
Broken example:
<?
echo "Hello";
?>
Why it is a problem:
- It may fail on environments where short open tags are disabled.
- The code becomes less portable.
Safer version:
<?php
echo "Hello";
?>
2. Confusing <? with <?=
These are not the same.
<?starts a PHP block.<?=outputs an expression.
Example:
<?= $name ?>
is equivalent to:
<?php echo $name;
Comparisons
| Syntax | Purpose | Portable | Recommended | Notes |
|---|---|---|---|---|
<?php ... ?> | Standard PHP block | Yes | Yes | Best default choice |
<? ... ?> | Short open tag | Not always | No | Can depend on configuration |
<?= ... ?> | Short echo output | Yes in modern PHP | Often yes | Good for templates |
<script language="php"> ... </script> | Alternative PHP block | Rarely used | No | Valid historically, uncommon in modern code |
Cheat Sheet
- Use
<?phpfor normal PHP blocks. - Avoid
<?because it is less portable. <?= $value ?>is shorthand for:<?php echo $value; ?>- In templates,
<?= ... ?>is often acceptable. - In PHP logic files, prefer full
<?phptags. - Escape HTML output when needed:
<?= htmlspecialchars($value) ?> - Do not use ASP-style tags like
<% %>in modern PHP. - Prefer team consistency over saving a few keystrokes.
Safe defaults
<?php
$value = "Hello";
?>
<p><?= htmlspecialchars($value) ?></p>
Rule of thumb
- Logic:
<?php
FAQ
Is <?= the same as <?php echo in PHP?
Yes. <?= $value ?> is shorthand for <?php echo $value; ?>.
Why is <? discouraged in PHP?
Because it may depend on server configuration, making code less portable across environments.
Is <?= safe to use in modern PHP?
Yes, in modern PHP it is widely supported and commonly used, especially in templates.
Should I use short tags in a team project?
Avoid <?. Use <?php for normal blocks. Use <?= only if your team's coding standards allow it.
Do short tags make PHP faster?
No meaningful performance benefit comes from using shorter tags. The main difference is readability and portability.
What is the best practice for PHP opening tags?
Use <?php as the default opening tag everywhere. Use <?= for concise output in HTML templates if appropriate.
Are short tags still found in legacy code?
Yes. Older PHP applications often used <?, but many teams replace them during maintenance for consistency and safety.
Mini Project
Description
Create a small PHP profile card page that mixes PHP and HTML correctly. The project demonstrates when to use <?php for logic and <?= for output, while avoiding unsafe or non-portable <? tags.
Goal
Build a PHP page that displays a user's profile information using standard PHP tags and short echo tags safely.
Requirements
- Define user data in a
<?phpblock. - Render the user's name, role, and city inside HTML.
- Use
<?= ... ?>for output inside the template. - Escape all displayed text with
htmlspecialchars(). - Do not use the
<?short open tag.
Keep learning
Related questions
Are PDO Prepared Statements Enough to Prevent SQL Injection in PHP?
Learn how PDO prepared statements prevent SQL injection in PHP, what they protect, and the mistakes that still leave MySQL apps vulnerable.
Can You Bind an Array to an IN Clause in PHP PDO?
Learn how PDO handles placeholders in IN() clauses, why arrays cannot be bound directly, and the safe PHP pattern to build dynamic queries.
Choosing the Right MySQL Collation for PHP and UTF-8
Learn how MySQL character sets and collations work with PHP, and how to choose a practical UTF-8 setup for web applications.