Zend, společnost, která stojí za enginem pohánějícím PHP 5, uspořádala soutěž o nejlepší aplikace v PHP 5, s cílem přiblížit a popularizovat nové objektové rysy tohoto jazyka. Cílem následujících článků je přinést vám pohled na novinky v PHP 5, a to tak, jak byly použity v praxi autory, kteří se „Zend’s Coding Contest“ zúčastnili.

Co je nového v PHP 5

Společnost Zend, vyvíjející engine pohánějící PHP, se rozhodla zpopularizovat nově uvedené PHP 5, a to formou soutěže s věcným dary (první cenou byl značkový notebook).

Soutěž měla pomoci rozšířit povědomí o PHP 5, o jeho nové objektové koncepci, a přispět k odpoutání se (některým programátorům) od psaní PHP kódu ve stylu QBasicu pro MS-DOS. PHP verze 4.0.6 a nižší k tomu někdy docela svádělo…

PHP 5 v podání Zendu je skutečně přelomové, protože přináší do tohoto skriptovacího jazyka konstrukce, které dosud byly známé spíše z jazyků jako je Java či C++.

PHP 5 přináší nově konstruktory a destruktory tříd, protected, private a public proměnné a metody tříd, abstraktní a final třídy, statické metody třídy, statické proměnné tříd s přiřazenou počáteční hodnotou, interface a jeho implementaci, funkce pro klonování objektů a hlavně výjimky (try, catch, throw), které rapidně zjednoduší a učiní robustnějším veškerý kód, který zpracovává chybové stavy.

Kromě těchto změn objektové koncepce je v PHP 5 nově zahrnuta i podpora pro SQLite, což je velice zajímavá embedded databáze, o velikosti cca 200 kB, která umí v podstatě to samé, co MySQL, a nemusí se nijak instalovat. SQLite databázi tvoří jeden soubor ve filesystému a nad ním se pracuje.

SQLite umí dokonce i pohledy (views), triggery a transakce a možnosti jejího (omezeného) SQL repertoáru je možné rozšiřovat pomocí callback funkcí nad PHP.

Tento rozsáhlejší úvod je zde záměrně, je totiž dobré si uvědomit, že PHP 5 se posunulo od PHP 4 do oblasti, kde může již konkurovat řadě jiných moderních programovacích jazyků a nepřipadat si jako chudý příbuzný.

Podmínky soutěže a její vítězové

Účastníkům soutěže bylo doporučeno několik typů aplikací (nicméně bylo možno poslat libovolný námět) a jednalo se o vcelku praktické věci:

  • galerie obrázků
  • online systém pro prezentace
  • online systém pro porovnání cen
  • agregace výsledků vyhledávačů
  • webová administrace SQLite databáze
  • webový správce souborů

Vítězem se staly nejlépe bodované aplikace, kde 50% váhu mělo hlasování veřejností a 50% váhu mělo hodnocení odborných porotců. Preferovány byly přitom aplikace používající v přiměřené míře nové objektové funkce PHP 5, XML a s dobrým a „čistým“ kódem.

Vítězové Zend’s PHP 5 Coding Contest:

  1. PRADO – komponent framework, obdoba vizuálních komponent pro PHP, které jsou inspirovány podobnými komponentami v Delphi, včetně jejich názvů
  2. wtcSQLite – kompletní administrace SQLite databází přes webové rozhraní
  3. LIMB – framework pro správu obsahu webu

wtcSQLite – webová administrace SQLite databáze

V tomto článku bych se chtěl podrobněji věnovat aplikaci, která skončila na druhém místě, tedy wtcSQLite. Napsal ji Andrew Gallant a poskytuje SQLite obdobné služby jako phpMyAdmin databázi MySQL. Umí tedy provádět vkládání, mazání a změnu tabulek, trigerů, indexů, pohledů a dat, včetně podpory pro ALTER TABLE (kterou SQLite standardně nemá – je potřeba vytvářet pomocnou tabulku s novou strukturou a kopírovat do ní data).

SQLite je databáze, která mě osobně okouzlila. Nejde zde ani tak o to, že SQLite umí pár věcí navíc oproti MySQL (triggery, pohledy), výborná na SQLite databázi je její embedded koncepce a engine, který pro databázi používá jediný soubor, v němž jsou obsaženy veškeré struktury tabulek, indexy i data.

Na data nejsou v SQLite přitom kladeny žádné typové nároky či požadavky, což se sice naprosto nehodí pro jejich bezpečné zpracování, ale například pro uchování šablon redakčního systému je to zcela ideální.

SQLite je navíc pro výběrové příkazy ještě o něco rychlejší než dosavadní přeborník pro (jednoduché) SELECTy, tedy MySQL.

wtcSQLite – koncepce a zajímavé třídy

Aplikace wtcSQLite se rychle rozvíjí, soutěže se účastnila verze 1.0.0, ale v době vzniku tohoto článku, tedy o pár týdnů později, byla již na serveru WebTricksCentral k dispozici verze 1.1.1.

Podíváme se tedy podrobněji na tuto novější verzi – mým cílem není přitom popis instalace této aplikace (číst readme.txt umí každý, navíc instalace spočívá jen v rozbalení ZIP archivu), ale pohled na zajímavé věci v kódu wtcSQLite z hlediska programátora.

Pozoruhodný databázový layer wtcSQLite

Začal bych pohledem na třídu SQLiteEnhanced, nejlepší část wtcSQLite aplikace, která je základním objektem pro práci s SQLite databází. Třída SQLiteEnhanced je pozoruhodná v tom, že umí zpracovávat i SQL příkazy typu ALTER TABLE abc ADD name VARCHAR(255);, a to zcela automaticky – pokud zavoláte její public function query($sql) metodu s počátečním textem ALTER, předá se řízení metodě alterTableQuery().

Je to to velice zajímavý layer, publikovaný v licenci GNU GPL a tedy použitelný i pro vaše open-source projekty. Z mého pohledu tvoří nejhodnotnější část wtcSQLite.

Novátorský template systém wtcSQLite

Druhou novátorskou věcí na wtcSQLite je její template systém. Ten by byl vcelku obyčejný a standardní (není ani navržen pro obecné použití a pro rozsáhlé šablony se evidentně nehodí, rovněž je psaný příliš „natvrdo“ k dané aplikaci), nebýt jeho koncepce ukládání šablon.

V archivu s wtcSQLite totiž dostanete i soubor templateSystem.sqlite.php, což není nic jiného, než naplněná SQLite databáze (již jsem se zmínil, že SQLite databáze je jen obyčejný soubor) se šablonami, které potom wtcSQLite používá pro zobrazování formulářů pro vkládání, změnu a mazání tabulek, indexů a triggerů.

Takže již žádné soubory se šablonami, jak je známe z aplikace phpBB či phpMyAdmin, či spouštění install.php nebo ruční vkládání do databáze. Dodává se samotná, naplněná SQLite databáze, s možností její jednoduché změny přímo přes webové rozhraní wtcSQLite.

Šablony je rovněž možno exportovat do XML souborů, za pomoci třídy ExportXML, a importovat z XML do SQLite databáze, za pomoci třídy ImportXML.

Celý systém je velice výhodný, nemusíte nic instalovat nebo konfigurovat a aplikace je ihned funkční. SQLite by přitom pro výběrové dotazy měla být ještě rychlejší než dosavadní přeborník v tomto oboru, tedy MySQL, a zde její koncepce získává pozoruhodný smysl.

Co se mi na wtcSQLite nelíbí, aneb programátorské chyby

Každý programátor je při pohledu na kód někoho jiného schopen během 5 minut popsat alespoň 10 chyb, kterých se onen dotyčný nešťastník dopustil. Kód se často píše rychle, aby prostě „už“ fungoval, nikoli pro krásu kódu samotnou. Nicméně, nalézat nepříliš efektivně napsané věci smysl má, minimálně proto, aby se z toho jiní programátoři poučili.

Zde se tedy, rovněž na příkladu wtcSQLite, podíváme na to, jak bychom své aplikace psát neměli.

Autorizace přístupu k databázi je ve wtcSQLite řešena velice jednoduše, a bohužel i nedostatečně, přes soubor config.xml.php, tedy XML soubor s definicí uživatelského jména a hesla, v němž je ale bohužel toto jméno a heslo uloženo bez jakéhokoli zašifrování, jako plain-text, bez pomoci funkce md5() či sha1().

O případné zpracování chyb se stará třída MyException, což je rozšíření vestavěné třídy Exception o specifické zpracování normálních a „fatal“ výjimek, a to místo dosavadního postupu přes trigger_error() a set_error_handler(). Bohužel, zde je další slabina aplikace, řada věcí, které by měly být ošetřeny pomocí Exception, ošetřeny vůbec nejsou. Patří sem zejména sada SQL dotazů v aplikaci (SELECT, INSERT, DELETE) nad SQLite databází, přitom právě pomocí Exception by to šlo v PHP 5 velice elegantně řešit.

Problémem ve verzi 1.0.0 bylo i zcela neošetřené a přímé použití $_GET, $_POST a dalších polí (následující verze toto odstraňuje hackem), bez ohledu na zapnuté get_magic_quotes_gpc(), což způsobuje v některých případech nefunkčnost či nedeterminovatelné chování celé aplikace.

Mnohem lepší, než přistupovat k těmto polím proměnných „natvrdo“, je nadefinovat si například následující funkce a ty potom používat místo polí:

function getVar($name) {
    return undoMagic($_GET[$name]);
}
function postVar($name) {
    return undoMagic($_POST[$name]);
}
function cookieVar($name) {
    return undoMagic($_COOKIE[$name]);
}
function requestVar($name) {
    return undoMagic($_REQUEST[$name]);
}
function serverVar($name) {
    return $_SERVER[$name];
}
function undoMagic($data) {
    return get_magic_quotes_gpc() ? stripslashes($data) : $data;
}

Osobně mi trochu vadí i nadměrné použití if() ... else ... if() ... else ve zdrojovém kódu aplikace. Zde se mi zdá přehlednější použití switch() ... case nebo rovnou definice specifické padesátiřádkové funkce pro každou operaci, než 800 řádků nestrukturovaného kódu. Ale to je spíše otázka osobního stylu, než vážná výhrada.

Zhodnocení wtcSQLite

Celkově je ale nutno říci, že celá aplikace wtcSQLite je napsána programátorsky slušně, s ohledem na čas, v jakém byla vytvořena, a s ohledem na novost PHP 5 a jeho koncepce.

Aplikace wtcSQLite používá nová objektová rozšíření PHP (public static function, protected function, exception), používá XML, SQLite. A je to navíc mimořádně užitečná utilita, na které se dále pracuje, již nyní plně využitelná při programování v PHP 5 s SQLite.

Zaslouženě získala v Zend’s PHP 5 Coding Contest stříbro.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět