[RFC] [Discussion] Native Markup Expressions
| From: | Liam Hammett | Date: | Tue, 14 Jul 2026 23:36:21 +0000 |
| Subject: | [RFC] [Discussion] Native Markup Expressions | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-131925@lists.php.net to get a copy of this message | ||
Hi internals,
I'd like to open discussion on a new RFC, "Native Markup Expressions":
RFC: https://wiki.php.net/rfc/native_markup_expressions
Implementation (with tests): https://github.com/php/php-src/pull/22661
It proposes a native syntax for HTML fragments as first-class PHP expressions,
akin to how the frontend community has adopted JSX, with composition and
escape-by-default output:
class Greeting implements Markup\Html
{
public function __construct(public string $name) {}
public function toHtml(): Markup\Html
{
return <>
<h1 class="title">Hello, {$this->name}!</h1>
<p>Welcome to PHP, where markup is a first-class
expression.</p>
</>;
}
}
echo <Greeting name="Rasmus" />; // rendered HTML, values escaped
Despite appearances, this is not a template language grafted onto the engine -
the syntax is pure compile-time sugar. Every markup expression lowers
during compilation to a plain
new expression:
$html = <button class="btn">Sign in</button>;
// compiles to exactly:
$html = new \Markup\Element('button', ['class' => 'btn'],
['Sign in']);
The RFC already answers many anticipated questions, and I am open
to making further adjustments so this can become a feature the whole
community benefits from.
Looking forward to your feedback.
Best regards,
Liam