1. Slovo úvodem

Od roku 1999 je to již několik let co Jiří Kosek vydal svoji knihu „PHP Tvorba interaktivních internetových aplikací“ a učinil tak malou revoluci. Mnoho lidí bez formálního vzdělání v oboru, bez znalosti anglického jazyka nebo s omezeným přístupem k internetu dostalo do rukou opravdu mocný nástroj. Díky tomu vzniklo mnoho stránek a aplikací a nejeden i jinak průměrný člověk dostal možnost se velice slušně živit, obzvláště když měl nápad. Bez povšimnutí pak nezůstává jistě ani fakt, že většina českých profesionálů začínala právě touto knihou. Chtěl bych tímto panu profesorovi poděkovat za jeho dílo i za jeho otevřenost a ochotu uvítat ve svých lavicích řady mladých lidí lačných po informacích, s hlavou v oblacích a s vidinou v očích.

Doufám, že tento seriál pomůže každému nadšenci, který se rozhodl pro vývoj „webových aplikací“ a nenechal se zastrašit komunitou odpůrců a všeználků. Posměšně se říká: „PHP je pro trpělivé lidi. Trpělivé od slova trpět.“. Buďte tedy trpěliví ve svém odhodlání a s každou etapou těchto článků poznávejte úskalí profesionálního programování.

2. Prvopočátky a inline PHP

Většina programátorů v jazyce PHP začínala rozšiřováním statické HTML prezentace o drobné či obsáhlejší interaktivní prvky. A tak asi každý alespoň jednou v životě napsal kód podobný následujícímu.

<html>
	<head>
		<title>Aktuální čas</title>
	</head>
	<body>
		Na serveru je právě <?php echo date("H:i"); ?> hodin.
	</body>
</html>

Takovému kódu není moc co vytknout. Dokumentuje opravdovou jednoduchost jazyka PHP, kdy si každý hned od začátku a bez hlubších znalostí může vyzkoušet takto jednoduše jednotlivé funkce jazyka. Nicméně tento přístup velice rychle narazí na nepřehlednost a efektivitu práce.

3. Vyčlenění duplicitního kódu

Jakmile začne být webová prezentace trochu větší, začne být správa opakujících se částí opravdu náročná. Rozkopírovávání hlaviček, patiček a menu se stane pomalu noční můrou a přestane dostačovat. Jedním z řešení této situace je HTML technologie iframe. Ta má však svá specifika a omezení.

Programovací jazyk PHP přináší podobnou technologii. Stačí příslušný „duplicitní kód“ oddělit do samostatného soboru a následně jej takzvaně includovat. Lze takto načítat nejen zdrojové kódy PHP, ale jakýkoliv soubor s téměř jakýmkoliv textovým obsahem. Stačí tedy použít následující kód a vygenerovaný výstup bude opět jeden HTML dokument.

<?php include("header.html"); ?>
<?php include("menu.html"); ?>
<div class="content">
	<h1>Nadpis článku</h1>
	<p>Samotné tělo článku. Zbytek stránky se přigeneruje až v momentu zpracování souboru PHP preprocesorem.</p>
</div>
<?php include("footer.html"); ?>

Tento přístup dokáže vystačit i na obsáhlé projekty, ale jak bude popsáno v následujících odstavcích, není zcela ideální. Velice rychle totiž přijde na řadu potřeba oddělit kód funkcionální a nikoliv vizuální.

4. Vlastní funkce

S vyšší znalostí přichází v zápětí i větší ambice. Množství aplikačního kódu začíná narůstat a zákonitě nastane potřeba použít jeden funkční kód na více místech. V takovém momentu přichází na řadu vytvoření vlastních funkcí, jak dokumentuje následující kód.

<?php
function showWelcomeMessage()
{
	if(date("d.m") === "24.12")
	{
		echo "Veselé vánoce";
	}
	else
	{
		echo "Dobrý den";
	}
}
?>

Takovéto funkce se pak obvykle ukládají do samostatného souboru. Obvyklé jméno takového souboru bývá function.inc nebo common.php. Tento soubor pak stačí na stánce načíst a použít, jak dokumentuje následující kód.

<?php
require("common.php");
?>
<html>
	<head>
		<title><?php showWelcomeMessage(); ?></title>
	</head>
	<body>
		<h1><?php showWelcomeMessage(); ?></h1>
	</body>
</html>
?>

Navíc je možné určit funkci, aby něco vracela a následně pracovat s jejím výsledkem. Předchozí kód by se tak dal upravit tak, aby funkce vracela textový řetězec, se kterým bude možné dále pracovat. Toho by se dosáhlo následujícím způsobem.

<?php
function showWelcomeMessage()
{
	if(date("d.m") === "24.12")
	{
		return "Veselé vánoce";
	}
	else
	{
		return "Dobrý den";
	}
}
?>

Výstup této funkce by bylo možné například převést na velká písmena a následně vypsat, nebo je vypsat rovnou, jak ukazuje následující příklad.

<?php
require("common.php");
?>
<html>
	<head>
		<title><?php echo showWelcomeMessage(); ?></title>
	</head>
	<body>
		<h1><?php echo strtoupper(showWelcomeMessage()); ?></h1>
	</body>
</html>
?>

U větších projektů však záhy nastane moment, kdy takovýchto funkcí bude větší množtví. V tento moment se obvykle začnou funkce rozdělovat podle použití do samostatných souborů (například function_eshop.php, function_anketa.php) které jsou pak dle různé logiky rozmístěny v adresářové struktuře aplikace. Dodnes můžeme najít mnoho aplikací, které jsou napsány právě tímto způsobem.

5. Šablonové systémy

Jedním z velice častých požadavků na aplikaci bývá možnost změnit vzhled aplikace. Změna vzhledu s sebou zákonitě nese i změnu struktury výsledného HTML dokumentu. V tento moment přichází na řadu oddělení aplikačního kódu od generování výstupu. Za tímto účelem vznikly takzvané šablonovací systémy. Mezi nejčastější tak patří například Smarty, LatteP.E.T. Všechny tyto systémy v sobě obsahují základní i mírně pokročilé funkce, které by měli zjednodušit práci html codera / grafika. Zároveň tak lze zajistit bezpečnost aplikačního kódu nezávisle na vzhledu. Zde se poprvé uvažuje rozdělení práce na více lidí v teamu podle rolí.

V této fázi je důležité upozornit, že aplikační část je ta, která předává vše potřebné do šablony. Nemělo by tak nastat, že by se v šabloně objevilo volání aplikačních funkcí. Jinými slovy by funkcionalitu aplikace měl řídit programátor a nikoliv grafik.

6. Práce s databází

Každá trochu větší aplikace potřebuje pro svoji práci nějakou databázi. Obvykle se pak jedná o nějaký druh relační databáze implementující jazyk SQL (Nejčastěji to bývá MySQL). Může však vyvstat potřeba použít aplikaci na jiném typu relační databáze. I na takové případy programovací jazyk PHP pamatuje a nabízí za tímto účelem abstrakční vrstvu PDO, nad kterou existují velice schopné nadstavby pro zjednodušení práce. Mezi velice zajímavé patří bezesporu Dibi, NotORM a \Nette\Database. Historicky první databázovou abstrakcí ještě z dob kdy neexistovala vrstva PDO bylo AdoDB, její implementace je však již poněkud zastaralá.

Potřeba změnit databázi se může jevit jako akademický problém, ale jejím pravým a často opomíjeným významem je doporučení oddělit aplikační funkce od funkcí, které přímo implementují základní operace s úložištěm. To se pak hodí v momentu, kdy vyvstane potřeba například změnit ukládání logovacích zpráv ze souborového úložiště na nějakou webovou službu. Díky správnému rozdělení funkcí se pak neovlivní aplikační logika a tím se významně snižuje riziko zanesení těžko odhalitelné chyby.

7. Rozšiřitelnost a udržitelnost

Jak je patrné, programování není jen o schopnosti analyticky rozdělit problém na jednotlivé základní operace programovacího jazyka. Mnohdy podstatnější a významnější část programování je právě ve schopnosti rozdělit výsledný koncept v podobě špagety jednotlivých úkonů do logických částí podle svého významu. Předchozí odstavce však stále uvažují práci pouze jednoho programátora. Když by měl takovouto aplikaci převzít další programátor, aby doplnil jednoduchou funkci, musel by se seznámit s celou aplikací a tedy i s myšlenkovými pochody a vizemi původního autora. Což významně prodlužuje dobu potřebnou pro rozšíření a tedy i náklady klienta. Poučený klient pak bude vyžadovat kvalitněji naprogramovanou aplikaci, jelikož v důsledku ušetří energii, čas i peníze. Prvním krokem pro opravdu kvalitní rozšiřitelný a udržitelný kód je použití objektově orientovaného programování, kterému se věnuje následující článek.