Mirin webspace

Nejbohatší život má ten, kdo žije s minimem nároků

13. 2. 2010 PHP

XHP - bohatší PHP syntaxe

Už se o tom zmínil Jakub Vrána, ale jeho článek se je poměrně dost povrchní. Zkusím se na php extenzi XHP od Facebooku podívat trochu podrobněji. Z marketingového hlediska je nutné zdůraznit, že možnost používat XML literály v PHP je opravdu velké plus. Je to např. jedna z mála věcí, kterou příznivci C# závidí VBkářům. Na druhou stranu je pravda, že použití XHP je o dost pomalejší oproti přímému zápisu řetězců v PHP.

Co to vlastně jsou XML literály v podání XHP? Pokud máme tenhle XHP kód

$href = 'http://www.php.net';
$url = <a href={$href}>PHP web</a>;
echo $url;

nebo spíše přímo

$href = 'http://www.php.net';
echo <a href={$href}>PHP web</a>;

Tak výsledkem bude vypsání HTML linku na web PHP. Celá magie je v tom, že v proměnné $url není textový řetězec, ale objekt, který vznikl při kompilaci skriptu. Ten má samozřejmě i metody, např. lze psát toto

$list = <ul />;
foreach ($items as $item) {
  $list->appendChild(<li>{$item}</li>);
}

XHP má i další zajímavé vlastnosti.

  1. umožňuje v {} uvádět na rozdíl od PHP řetezců jakýkoli PHP výraz, ne jen pouze proměnnou
  2. kontextové escapování
  3. validaci již při kompilaci skriptu na serveru, $header = <h1>Header</h2>; není validní XML literál, </h2> není ukončení <h1>
  4. možnost definovat si vlastní třídy pro elementy, atributy a dokonce specifikovat hierarchii pro validaci

Definice vlastních elementů a atributů má speciální syntaxy, která není validní PHP syntaxe pro zápis PHP tříd. Je to další specifikum XHP. Příklady můžete najít adresáři v php-lib, kde je definice core xhp elementů a html elementů.

Podle dokumentace dělá XHP extenze to, že obsahuje parsování a kompilaci vlastního jazyka, který je nadmnožinou standardního PHP. Výsledek je pak předán dále do PHP, které ho pak vykoná. Kompilátor lze využít i v podobě dodávaného programu xhpize, který generuje z XHP standardní PHP, můžete tak XHP použít i na hostingu, kde žádná xhp extenze není.

Parser dokonce rozumí jedné konstrukci, která je v PHP už dlouho postrádána - podpora operátoru [] jinde než jen na proměnné. V XHP tedy můžete napsat

$bar = foo()['bar'];

a v $bar dostanete hodnotu prvku s indexem 'bar' z pole, které vrátila funkce foo.

Je zde také zřejmý ten problém s výkonem. Každý vypisovaný XML literál se zkompiluje do objektu a volání metody render, což je samozřejmě mnohem náročnější, než vypisování řetezců v PHP. Už samotná bytecode cache to dokáže docela zlepšit.

Celkově je to velmi zajímavé řešení, které velmi rozšiřuje možnosti PHP jako prostředku pro frontend. Killer feature je právě parser nadmnožiny standardního PHP, který přináší výše zmíněnou validaci již při kompilaci skriptu, to pravděpodobně žádný dosud existující PHP šablonový systém neumí a jen tak umět nebude. I když ono se to ani se šablonovacímy systémy moc srovnávat nedá.


Komentáře (0)

Komentáře jsou uzavřeny.