Re: [RFC] [Discussion] Native Markup Expressions

From: 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.

« previous php.internals (#131931) next »