XHP – XML přímo v PHP

Školení, která pořádám

Výbornou vlastností pro začátky s PHP je, že lze kód přímo kombinovat s HTML výstupem. U větších projektů je to ale spíše na škodu, takže se sahá k oddělení PHP a HTML kódu. Ten se obvykle umisťuje do šablony, která může být napsaná také v PHP – pak se ale kodér musí hlídat, aby nepoužíval nepovolené konstrukce, a navíc se všechen výstup musí ručně ošetřovat. Proto se častěji používají speciální šablonovací jazyky (např. Smarty), které jsou funkčně omezené a které se o ošetřování dat mohou starat samy. Pak se ale zase člověk musí učit nový jazyk.

Zajímavou třetí možnost přinesl Facebook s projektem XHP. Ten dovoluje zapisovat XML kód přímo do PHP podobně jako je to možné ve Visual Basicu nebo v některých implementacích JavaScriptu.

<?php
require './core.php';
require './html.php';
if ($_POST['name']) {
  echo <span>Hello, {$_POST['name']}.</span>;
} else {
  echo
    <form method="post">
      What is your name?<br />
      <input type="text" name="name" />
      <input type="submit" />
    </form>;
}
?>

Všimněte si, že XML elementy nejsou uzavřeny do řetězce, což je právě smysl XHP. Kromě trochu jednoduššího zápisu je možné díky tomu XML validovat a automaticky ošetřovat vypisovaná data, o což se XHP stará.

Výkonnost

Rasmus Lerdorf se podíval na výkonnost tohoto řešení a zjistil, že proti čistému PHP je asi čtvrtinová. To je dost žalostný výsledek, musíme ale vzít v úvahu následující:

I tak je výkon stále horší, Facebook už ale XHP vesele používá. Mohou si to dovolit myslím hlavně díky převaděči PHP do C++ HipHop, který velkou část režie pojme.

Závěr

Což o to, přístup to je zajímavý, ale osobně zůstanu u šablon Nette, které mají velmi dobře použitelnou syntaxi a díky převodu šablon do PHP také výkon srovnatelný s čistým PHP kódem. Nezanedbatelnou výhodou je také to, že jsou použitelné i bez speciální extenze.

Jakub Vrána, Seznámení s oblastí, 12.2.2010, diskuse: 15 (nové: 0)

Diskuse

Karel Klíma:

Nemůžu si pomoci, ale to XHP mi od prvního okamžiku přišlo jako zmetek. "Ssyntax" (nebo spíše prasosyntax) je náchylná na chyby, již zmíněná výkonnost stojí za málo a navíc to vymysleli pro Facebook - stránku, která se dlouhodobě potýká s výkonnostními problémy.

Osobně si myslím, že XHP nemá vůbec žádný přínos. Je to jenom další zbytečný výmysl.

optik:

XHP má něco do sebe, Jakubův článek je příliš stručný, více např. na wiki http://wiki.github.com/facebook/xhp/
nebo na http://mirin.cz/blog/xhp-bohatsi-php-syntaxe

DT:

Nativní literal pro XML (a vůbec XML datový typ) by PHP určitě slušel. Už proto, že je XML právem považován za formát budoucnosti.
Třeba se někdy dočkáme.

wdolek:

uff, tak ta ukazka, to je jen priklad toho, jak se to delat nema :D

ono je jedno, jestli je to v uvozovkach nebo ne ;) porad nejake `echo`. dostal sem nedavno za ukol ve skriptu PHP+HTML (primy vystup HTML) zmenit kompletni layout stranky.
a to byla moc velka zabava hledat vsechny ty "echa" kde zacina a konci blok, nemluve o obsahu uvnitr.

ikona Jakub Vrána OpenID:

Ono se bez toho echo dá dost těžko obejít, stránka se nakonec nějak vypsat musí. Důležité je především oddělit HTML kód od získání dat a zpracování uživatelského vstupu. A s tím XHP nemá problém, ale člověk to musí sám chtít.

Alternativou k výpisu by bylo snad jen dokument vytvářet v paměti pomocí $dom->createElement a spol., to má ale řadu jiných nevýhod (od ukecanosti až k pomalosti).

ikona v6ak:

Bez echo je možné psát pomocí fopen a fwrite díky php://output. Ale proč to dělat?

fos4:

Jedna z mala věcí co se mne na XHP líbí je :
$bar = foo()['bar'];

mach:

Z clanku mi neni jasne, proc by tohle mel byt dobry napad. V prvnim odstavci je zminene spatne reseni (HTML kod v PHP) a pak spravne reseni (sablony). Potom je receno, ze XHP je nekde mezi - prelozeno to tedy rika "XHP je z pulky spatne reseni". Jako jedine pozitivum je potom uvedeno, ze se nemusi psat uvozovky. Je to vsechno?

Uz sem dlouho weby nedelal, nicmene predpokladam, ze porad je idealni to, kdyz PHP udela jenom nejakou abstraktni datovou strukturu (nejakej komplikovanej array) a az sablonovaci system z toho vyplodi HTML/PDF/cokoliv.

bzuK:

Architektura aplikace s abstraktní/datovou vrstvou a šablonovacím systémem je ideální *pro aplikace většího rozsahu*, jak zmiňuje i článek.

Pro různé jednorázové exporty dat, XML feedy a menší aplikace s XML rozhraním může být právě XHP tou ideální volbou, díky za tip. Forma extenze PHP ho zatím řadí spíš do kategorie "raději nepoužívat", ale jako nativní zápis řetězců v PHP by to nebylo marné.

Tom:

Docela podobné jako Heredoc (http://en.wikipedia.org/wiki/Here_document#PHP)

ikona Jakub Vrána OpenID:

Ano, trochu. Zásadní rozdíl je v tom, že XHP značky validuje a předaná data automaticky ošetřuje.

Martin:

Jaká je výkonnost pokud vkládám HTML do rozděleného PHP.
Je stejná jako při použití echo?
Jako např.:

<?php // nějaký script ?>

<html>
<body>
</body>
</html>

<?php // pokračování ?>

ikona Jakub Vrána OpenID:

Není v tom zásadní rozdíl.

Martin Dejmek:

Přijde mi to jako hrozne nepřehledné řešení. Když to chci mít pěkně přehledné použiji Smarty templaty které se nakonec zkompilují do rozděleného PHP a vyjde to nastejno, jen s tím rozdílem, že se v tom snáze orientuje. Ale stejně si myslím že ješte lepší způsob jsou teď javascriptové templaty a plnit to daty v json formátu. U velkých projektů kde se často mění obsah, má vysokou návštěvnost to ušetří ve finále hodně když server po prvním načtení posílá pouze krásný úsporný json.

ikona Jakub Vrána OpenID:

Z osobní praxe ve Facebooku, kde je tím prolezlý celý kód, musím říct, že to nijak zvlášť nepřehledné není, dokonce ani bez editoru se zvýrazňováním této syntaxe.

JSON zase tak zvlášť úsporný není, protože klíče posílá s každou položkou vždy znovu. Ale je pravda, že to je pořád lepší než celé HTML.

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.