Re: [RFC] [Discussion] Native Markup Expressions
| From: | Garrett W. | Date: | Wed, 15 Jul 2026 01:24:08 +0000 |
| Subject: | Re: [RFC] [Discussion] Native Markup Expressions | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-131931@lists.php.net to get a copy of this message | ||
On Tue, Jul 14, 2026 at 7:31 PM Liam Hammett
<liam+phpinternals@liamhammett.com> wrote:
>
> 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
So if I can do <ClassName::staticMethod ...>, what about
<$obj->method ...> if that method returns a Markup\Html (not a
string)? I didn't see that case addressed in the RFC, so I can only
assume that would be an error, but ... should it be allowed?
--
Garrett W.