PHP 1.
Úvod do PHP Tato přednáška obsahuje úvod do skritpového jazyka PHP. Ten je podobný ostatním
jazykům vyšší úrovně, jako je například jazyk C, Pascal, Fortran nebo Java, takže programátoři se zkušeností z kteréhokoli podobného jazyka by při studiu jazyka PHP neměli mít sebemenší problémy. T této přednášce se budeme opírat o verzi PHP4, kterou budeme označovat stručně jen jako PHP. Zkratka PHP je rekurzivní, protože je definovaná pomocí sebe sama – znamená PHP: Hypertext Preprocesor neboli „PHP: hypertextový procesor“. Tento poněkud zvláštní styl pojmenovaní zavedl systém GU, který znamená GU’s Not Unix („GNU není Unix“) Ani název PHP necharakterizuje nijak zvlášť dobře povahu jazyka a jeho obvyklé využití. PHP je skriptový jazyk, který se obvykle vkládá do kódu HTML případně se s ním kombinuje. Má celou řadu vynikajících knihoven, jež poskytují rychlý přístup k databázovým systémům s možností vlastního přizpůsobení. Je tedy ideálním nástrojem pro vývoj aplikační logiky prostřednictvím vrstvy třívrstvých aplikací.
2.
Základy PHP Prvním skriptem, který budeme v této přednášce rozebírat je obligátní „Ahoj světe“.
Při vyžádání stránky z prohlížeče se skript spustí na webovém serveru a do prohlížeče se zpět odešle výsledný dokument HTML, jenž po zobrazení vypadá podobně jako na obrázku 1. Příklad 1 První příklad v PHP
Ahoj světe < h1> < ? php echo "Ahoj světe"; ?>
Na příkladu 1 si můžeme úkázat základní vlastnosti skriptu PHP. Celý kód stránky je směsicí kódu HTML a vlastního skriptu PHP. Tento skript tvoří v prvním případě jen tři řádky: < ? php echo "Ahoj světe"; ?>
a jednoduše vytiskne pozdrav „Ahoj světe“. Skript PHP v příkladu 1 nemá ve skutečnosti příliš velký smysl. Bylo možné napsat obyčejnou stránku HTML a pozdrav v ní vytvořit přímo. Jazyk PHP se s kódem HTML velice dobře integruje, a proto je generování statických řetězců podstatně méně komplikované. Na tomto příkladu si budeme ilustrovat několik důležitých vlastností PHP: •
Začátek a konec skriptu vymezují značky PHP a ?> nebo ještě stručněji a ?> Delší verze počáteční značky PHP zabraňuje konfliktu s jinými instrukcemi pro zpracování, které je možné do kódu HTML zapisovat.
•
Mezerové neboli „bílé“ znaky nemají na činnost kódu žádný vliv, pouze zlepšuje jeho čitatelnost pro vývojáře. Skript by jsme mohli stručně zapsat na jednom řádku, pomocí textu php echo "Ahoj světe"; ?> Jednotlivé příkazy můžeme oddělovat libovolnou kombinací mezer, tabulátorů, návratů vozíku a podobných prázných znaků.
•
Skript PHP tvoří posloupnost příkazů, z nichž každý je ukončen středníkem. V našem příkladu se nachází jeden příkaz a to: echo "Ahoj světe";
•
Skript PHP se může nacházet na jakémkoli místě souboru a může se libovolně střídat s fragmenty kódu HTML.
•
Vykonaný skript PHP se ve výsledné stránce plně nahradí svým výsledkem, a to včetně původní počáteční a koncové značky skriptu PHP a ?> . Možnost zcela volného vkládání jakéhokoliv počtu skriptů do zdrojového kódu HTML
je jednou z nejzajímavějších vlastností PHP. Malou ukázkou je příklad 2, ve kterém před začátkem dokumentu HTML inicializujeme příkazem $outputString = “Ahoj světe“ proměnnou, kterou později dvakrát použijeme a vypíšeme na výstup, a sice v rámci elementů
a . O proměnných a práci s nimi budeme dále hovořit podrobněji.
Příklad 2 Použití proměnných php $outputString = “Ahoj světe“; ?>
php echo $outputString; ?>
php echo $outputString; ?>
Možnost vkládání libovolného počtu skriptů do stránky TML může ovšem vést také k těžkopádnému a obtížně udržovatelnému kódu. Programový kód skriptu a kód HTML je proto vhodné pečlivě sestavit do modulů.
2.1.
Vytváření skriptů PHP
Skript PHP můžeme napsat jako prostý text a můžeme jej tedy vytvořit v libovolném textovém editoru, jako například „Poznámkový blok“. Jestliže skript uložíme do souboru s příponou .php a umístíme jej pod adresář, konfigurovaný jako kořen dokumentů Apache, bude jej webový server Apache vykonávat při každém požadavku na daný zdroj informací. Příklad kořenového adresáře /usr/local/apache/htdocs/.
2.2.
Komentáře
Komentáře se do programového kódu skriptu vkládají pomocí stalů zápisu, známých z ostatních vyšších programovacích jazyků. Konkrétmě máme k dispozici tyto styly komentářů: // Toto je jednořádkový komentář # Toto je druhý typ jednořádkového komentáře /* A takto zapisujeme komentáře přes několik řádků */
2.3.
Výpis dat pomocí příkazů echo a print
K výpisu dát se používá příkazů echo nebo print například: Echo „Ahoj světe“; // příkaz print funguje úplně stejně print „Ahoj světe“; // stejně můžeme vytisknout i čísla echo 123; // a zrovna tak I obsah proměnných echo $outputString;
Rozdíl mezi příklady echo a print spočívá v tom, že příkazem echo můžeme vypsat i více než jeden argument: echo “Ahoj“, “světe“;
Výpis dat můžeme docílit pomocí zkráceného zápisu =$temp; ?>, který vypíše proměnnou temp. Argumenty příkazů echo a print se často zapisují do závorek. U příkazu echo použití závorek umožní použití jen jednoho argumentu.
2.4.
Řetězcové literály
V PHP je možné definovat řetězcové laterály uvozené klasickými uvozovkami i apostrofy. Potřebujeme-li tedy zapsat uvozovky do řetězce, přejdeme k řetězcům zapsaným do apostrofů a obráceně: echo ‘Toto bude fungovat‘; echo “a toto zrovna tak“; // A tady je několik řetězců s uvozovkami echo “Tento řetězec obsahuje ‘ : apostrof!“; echo ‘Tento řetězec obsahuje “ : uvozovky!‘;
Znaky citací, apostrofy a uvozovky můžeme zapsat pomocí zpětného lomítka jako znaménkového znaku: echo “Tento řetězec obsahuje \“ : uvozovky !“; echo ‘Tento řetězec obsahuje \’ : apostrof !‘;
Jednou z vlastností PHP je možnost vložit přímo do řetězcového literálu také hodnotu proměnné. Jazyk PHP totiž řetězce zapsané v uvozovkách analyzuje a nahrazuje v nich názvy proměnných příslušnou hodnotou. Například: $počet=45; $vozidlo=“trolejbus“; $zpráva=“Tento $vozidlo pojme $počet osob“; // tento příkaz vypíše “Tento trolejbus pojme 45 osob“ echo $zpráva;
2.5.
Proměnné
Proměnné v jazyce PHP vymezuje znaménko dolaru a za ním název proměnné. Použité proměnné nemusíme nijak zvlášť deklarovat a před prvním přiřazením hodnoty nemají ani žádný typ. Typ proměnné se přiřazuje implicitně použitím určitého typu proměnné a v průběhu jejího života je možné tento typ libovolně měnit. Například:
$prom=15;
- celočíselná
$prom=“Kocour Mikeš“;
- řetězcová
V názvech proměnných PHP se rozlišuje velikost písmen, takže $proměnná, $Proměnná $Proměnná a $PROMĚNNÁ představují různé proměnné.
Poznámka: Častým zdrojem chyb v PHP je nahodilé vytvoření více proměnných s podobným názvem které se liší velikostí písmen. Popsaná flexibilita jazyka PHP je veice příjemná ale také zákeřná a nebezpečná.
2.6.
Typy
Jazyk PHP zná čtyři základní typy: •
Logický (booleovský),
•
Reálný (float s pohyblivou řádovou čárkou),
•
Celočíselný (integer),
•
Řetězcový (string).
Dále jsou definovány dva složené typy: •
Pole (array),
•
Objekt (object).
Proměnné skalárního typu mohou v jakémkoli okamžiku obsahovat vždy pouze jedinou hodnotu. Proměnné složeného typu (pole a objekt) jsou proti tomu složené z více skalárních hodnot, případně z jiných složených hodnot.
2.6.1.
Booleovské (logické) proměnné
Booleovské proměnné jsou velice jednoducé: můžeme do nich přiřadit pouze hodnotu true nebo false (pravda, nepravda) $prom=false; $test=true;
2.6.2.
Reálna a celočíselná proměnná
Celočíselná proměnná obsahuje celé číslo, zatímco reálná proměnná s pohyblivou řádovou čárkou může mít exponent a zlomkovou část. Reálné je tak například číslo 123.01 (desetinným oddělovačem je tečka) a stejně tak i 123.0. Číslo 123 je celočíselný údaj.
// Toto je celočíselná hodnota $prom1=6; // A toto je reálny údaj $prom2=6.0; // Reálná hodnota 1120 zapsaná pomocí exponenciálního zápisu $prom3=1.23e3; // A toto je reálny údaj rovný 0,02 $prom4=2e-2;
2.6.3.
Řetězcové proměnné
Ukázka řetězcových proměnných $promena=“Toto je řetězec“;
2.7.
Konstanty
Konstanta představuje spojení názvu s určitou prostou, skalární, neměnnou hodnotou define(“pi”, 3.14159); // Tento příkaz vypíše hodnotu 3.14159 echo pi;
Před konstanty se znak $ nezapisuje a po definici se už konstanta nemůže měnit a můžeme k nim přistupovat z kteréhokoliv místa skriptu bez ohledu na to kde ji deklarujeme a mohou obsahovat pouze jedinou, jednoduchou skalární hodnotu.
2.8.
Přiřazování proměnných
Do proměnné zapíšeme hodnotu výrazu vpravo od znaménka rovná se. V jazyce PHP funguje většina číselných přiřazení obdobných vyšším programovacím jazykům. // Přiřazení hodnoty do proměnné $prom=1; // Celé číslo vypočtené jako součet dvou celých čísel $prom=4+7; // Výsledek odčítání, násobení a dělení $prom=(($prom-5)*2)/3 ; // Všechny výrazy přičtou k proměnné $prom jedničku $prom=$prom+1; $prom+=1; $prom++; // Všechny výrazy odečtou od proměnné $prom jedničku $prom=$prom-1;
$prom-=1; $prom--; // Přiřazení dvojnásobku hodnoty $prom=$prom*2; $prom*=2; // Poloviční hodnota $prom=$prom/2; $prom/=2;
Pro složitější operace definuje matematická knihovna PHP celou řadu matematických funkcí. Podobným způsobem fungují řetězcové přiřazení a výrazy: // Přiřazení řetězcové hodnoty do proměnné $prom=”pokusný řetězec”; // Zřetězení neboli spojení řetězců jehož výsledkem je „pokusný řetězec“ $prom=”pokusný” .”řetězec”; // Přidání jednoho řetězce nakonec druhého $prom=”pokusný”; $prom=$prom .”řetězec”; // Zkrácený zápis rozšíření řetězce o jiný řetězec $prom=”pokusný”; $prom.=”řetězec”;
2.9.
Výrazy
Výrazy se v jazyce PHP formulují podobně jako v ostatních jazycích. Výraz se skládá z literálových hodnot, operátorů a volání funkcí, které vracejí hodnoty. PHP vykonává potřené konverze při kombinaci různých typů ( výsledkem 4+7.0 bude 11.0).1 Podobně i priorita operátorů při vyhodnocování výrazů je obdobná jako v jakémkoliv jiném jazyce. Odporučuje se ale používat závorek, které mají nejvyšší prioritu a jednoznačně definují postupnost vyhodnocování operátorů.
3.
Podmínky a větvení Podmínkové příkazy nabízejí ve skriptech možnost řízení a větvení do různých
příkazů, které se provedou při splnění nebo nesplnění jisté podmínky ( tedy jestliže je určitý výraz roven true nebo false). Příkazy pro větvení jsou v PHP k dispozici dva: •
1
if s nepovinnou klausulí else.
Konverzi proměnných v přednášce nebude věnována pozornost.
•
3.1.
switch který se obvykle zapisuje s dvěma nebo více klausulemi case.
Příkaz if …. else
Příkaz if podmíněně řídí provádění skriptů. V základním formátu se testuje pravdivost určité podmínky. Příkaz if může mít také nepovinnou klausuli else, jejíž příkaz nebo blok příkazů (uzavřených do složených závorek)2. $prom=6; if ( $prom>5) echo ”Proměnná je větší než 5”; else {echo ”Proměnná je menší nebo rovná 5”; echo “Proto je třeba vykonat….“;}
Z několika po sobě jdoucích podmínkových testů můžeme vytvořit složitou strukturu rozhodovacích bloků if ( $prom<5) echo ”Hodnota je moc malá”; else if ( $prom<10) echo ”Hodnota je malá”; else if ( $prom<20) echo ”Hodnota je velká”; else
if ( $prom<30) echo ”Hodnota je moc velká”; Zápis těchto o sobě jdoucích, postupně vyhodnocovaných podmínek můžeme zjednodušit pomocí příkazu elseif if ( $prom<5) echo ”Hodnota je moc malá”; elseif ( $prom<10) echo ”Hodnota je malá”; elseif ( $prom<20) echo ”Hodnota je velká”; elseif ( $prom<30) echo ”Hodnota je moc velká”;
3.2.
Příkaz switch
Příkaz switch je při výběru ze seznamu voleb alternativou k příkazu if Switch ($menu) {
case 1: echo “Vybral jsi číslo jedna; br eak ; case 1: echo “Vybral jsi číslo dvě; br eak ;
2
Je možno použít i přímo po if.
case 1: echo “Vybral jsi číslo tři; br eak ; case 1: echo “Vybral jsi číslo čtyři; br eak ; case 1: echo “Vybral jsi něco jiného; br eak ; }
Stejný příkaz by bylo možné implementovat pomocí příkazů if a elseif, ale zápis příkazu switch je obvykle kompaktnější, čitelnější a efektivnější. Příkazy breake j jednotlivých větvích zabraňují vykonání ostatních příkazů, jež následují v bloku switch a pokračuje příkazem za následující složenou závorkou.
3.3.
Podmínkové výrazy
Základní porovnání v podmínkovém výrazu •
Rovnost
if ( $prom==1) echo ”Hodnota je rovná jedné”;
•
Nerovnost
if ( $prom!=1) echo ”Hodnota nerovná jedné”;
•
Menší
if ( $prom<1) echo ”Hodnota je menší než jedné”;
•
Větší
if ( $prom>1) echo ”Hodnota je větší než jedné”;
•
Menší nebo rovno if ( $prom<=1) echo ”Hodnota je menší nebo rovná jedné”;
•
Větší nebo rovno
if ( $prom>=1) echo ”Hodnota je větší nebo rovná jedné”;
Výrazy je možné kombinovat pomocí závorek a logických operátorů: •
AND, Logické A
•
OR, Logické NEBOif ( $prom==1) || ($prom==7) echo ”Hodnota se rovná 1 nebo 7”;3
if ( $prom>=1) && ($prom<=7) echo ”Hodnota je mezi 1 a 7”;
Složitější výrazy můžeme formulovat pomocí vhodné kombinace logických operátorů a libovolně zapsaných závorek. •
if ((( $prom>=1) && ($prom<=7))||(( $prom>=11) && ($prom<=77))) echo ”Hodnota je mezi 1 a 7 nebo 11 a 77”;
K porovnání řetězců je možné použít podmínkových operátorů ale častěji používáme knihovní funkci PHP strcmp( ). Jakýkoliv z probraných logických výrazů můžeme dále negovat pomocí symbolu vykřičník ! if ( $prom==1) echo ”Hodnota je rovná jedné”; if ( !($prom!=1)) echo ”Hodnota je rovná jedné”;
oba výrazy jsou ekvivalentní.
3
|| je možné na české (slovenské) klávesnici zapsat levý Alt+w
3.4.
Cykly
V jazyku PHP jsou definovány čtyři typy cyklů: •
while
•
do … while
•
for
•
forech
3.4.1.
- používá se výhradně u polí
Cyklus while
V cyklu while se opakuje jeden nebo více příkazů – tělo cyklu – dokud zadaná vstupní podmínka zůstává pravdivá. Pokud podmínka hned na začátku není splněná, neprovede se tělo cyklu ani jednou. Stejně jako u příkazu if můžeme i zde zapsat do těla cyklu několik příkazů, uzavřených mezi složené závorky. $čítač=1; while ($čítač<11) { echo $čítač; echo“ “; // zvýšíme $čítač o jedničku $čítač++; }
3.4.2.
Cyklus do …. while
Rozdíl mezi cyklem while a do … while spočívá v místě kontroly platnosti podmínkového výrazu. V cyklu do …. while se podmínka vyhodnocuje až po vykonání těla cyklu a cyklus se opakuje, dokud je podmínka pravdivá. $čítač=1; do { echo $čítač; echo“ “; // zvýšíme $čítač o jedničku $čítač++; }
while ($čítač<11) ;
3.4.3.
Cyklus for
Cyklus for je mezi všemi konstrukcemi cyklů nejkomplikovanější, ale zároveň vede k nejkompaktnějšímu programovému kódu. for ($čítač=1; $čítač<11; $čítač++;) { echo $čítač; echo“ “; }
Hlavička cyklu form má celkem tři části, oddělené středníky, přičemž všechny jsou nepovinné: •
Inicializační příkazy Tyto příkazy se provádějí pouze jednou, a to před prvním vstupem do těla cyklu
•
Podmínka opakování cyklu Podmínkový výraz, který se vyhodnotí před každým vykonáním těla cyklu. Jestliže se podmínkový výraz vyhodnotí jako nepravdivý (false), tělo cyklu se již nevykoná.
•
Příkazy pro dokončení iterace cyklu Příkazy které se provedou po každém vykonání těla cyklu
3.4.4.
Cyklus forech
Příkaz forech byl zavedený v jazyku PHP4 a představuje pohodlný způsob procházení hodnot pole. Podobně jako cyklus for provádí cyklus forech své tělo jedenkrát pro každou hodnotu v poli. Příklad převodu hodnot pole z cm na palce: // Sestavíme pole celých čísel $delky=array(0, 107, 202, 400, 475); /Nyní pole údajů v centimetrech převedeme na palce forech ($delky as $cm) { $inch=$cm/2.54; echo“ $cm centimetrů = $inch palců\n “; }
3.5.
Příklad
V této časti je uveden jednoduchý kompletní skript PHP. Vytvoříme webovskou stránku s násobilkou. Na začátku vývoje si musíme uvědomit, jak bude výsledek skriptu vypadat, tedy jaký text formátu HTML potřebujeme vygenerovat.
Násobilka Násobilka
Násobilka číslem 1
1 x 1 = 1
2 x 1 = 1 3 x 1 = 1
4 x 1 = 1 5 x 1 = 1
Kompletní skript PHP a kód HTML, jež vytváří tabulku s násobilkou (následující příklad)
Násobilka Násobilka
Násobilka číslem ", $table, "\n"; //Pro každou tabulku vytvoříme 12 řádků
for ($counter=1; $counter<13; $counter++) { $answer=$table*$counter; //Generuje sudý řádek? if ($counter % 2 == 0) echo "
", $counter," x ",$table," =
//Ano, vytiskneme jej tučně ",$answer,""; else //Ne, vytiskneme jej obyčejným písmem
echo "
", $counter," x ",$table," = ",$answer,""; } } ?>
Vnější cyklus for používá celočíselnou řídící proměnnou
$table,
kterou
postupně
inkrementujeme o jedničku s každým provedením těla, až dosáhneme hodnotu 12. Tělo vnějšího cyklu vytiskne záhlaví a spustí vnitřní cyklus, který již vypisuje jednotlivé řádky. Každý druhý řádek a každý nadpis je uzavřen do značek tučného textu. Operace modulo if ($counter % 2 == 0) vydělí proměnnou $counter dvěma a vrátí celočíselný zbytek. Je-li $counter rovna 6, vrátí se hodnota 0. Obrázek 1 Výsledek skriptu „Násobilka“
Když je $counter rovna 11, vrátí se hodnota 1, protože 11/2=5 se zbytkem 1. To znamená, pokud
je proměnná $counter sudé číslo, bude podmínkový výraz ($counter % 2 == 0) pravdivý a řádek násobilky se vytiskne tučně.
4.
Pole Pole v jazyku PHP jsou velice důmyslná a jsou flexibilnější než ve většině ostatních
vyšších programovacích jazyků. Pole je uspořádaná množina proměnných, které se nazývají
prvky neboli elementy pole. Formálně mohou být číslovaná nebo asociativní (k poli přistupujeme prostřednictvím číselného indexu nebo přes textový řetězec). Mohou obsahovat jak skalární hodnoty (celočíselné, logické, řetězcové nebo reálné hodnoty), tak i složené hodnoty (objekty a dokonce i další pole). Jedno pole může navíc obsahovat hodnoty různých typů.
4.1.
Vytváření polí
Pro vytváření polí definuje PHP jazykovou konstrukci array( ). $čísla=array(9, 8, 7, 6); $slova=array(“webové“, “databázové“, “aplikace“); // vytiskne třetí element pole celých čísel – 7 echo $čísla[2]; // vytiskne první element pole řetězců – webové echo $slova[0];
Index prvního elementu pole je tady implicitně roven nule. Jednotlivé hodnoty v poli načítáme a modifikujeme pomocí zápisu s hranatými závorkami. $jedlo[0]=“brambory“; $jedlo[1]=“zelí“; $jedlo[2]=“knedlíky“; // teď třetí element nahradíme jinou hodnotou $jedlo[2]=“okurky“;
U polí s číselnými indexy můžeme v okamžiku jejich vytvoření stanovit jakoukoliv počáteční hodnotu indexu. Často je pohodlnější začínat indexování polí jedničkou. $čísla=array(1=>“jedna“, “dvě“, “tři“);
Pole můžeme vytvořit také jako řídké, kdy obsazené indexy netvoří spojitou posloupnost $licháčísla=array(1=>“jedna“, 3=> “tři“, 5=> “pět“);
Vytvoření prázdného pole, které později můžeme naplňovat $prostor=array( );
4.2.
Asociativní pole
K hodnotám uloženým v asociativním poli se přistupuje pomocí řetězcových indexů neboli klíčů. Asociativní pole můžeme vytvořit pomocí konstrukce array ( ) $pole=array(“první“=>1, “druhý“=>2, “třetí“=>3); //Vypíše druhý element pole, tedy 2 echo $pole ( “druhý“);
obdobně by bylo možné vytvořit pole pomocí syntaxe s hranatými závorkami
$pole[“první“]=1; $pole[“druhý“]=2; $pole[“třetí“]=3;
4.3.
Heterogenní pole
Hodnoty ukládané do jednoho určitého pole, nemusí být v jazyce PHP nutně stejného typu. Pole v PHP mohou obsahovat různorodé neboli heterogenní hodnoty. $smíšenéZboží=array(“kočka“, 15, 8.5, false);
Funkce var_dump ( ) vypíše při svém volání obsah pole var_dump($smíšenéZboží); array(4) { [0]=>string(3) “kočka“ [1]=>int (15) [2]=>float ( 8.5) [3]=>bool (false) }
4.4.
Vícerozměrná pole
Pole v jazyce PHP mohou obsahovat další pole. Tím se vytváří vícerozměrná (multidimenzionální) pole.
Vícerozměrná pole Dvourozměrné pole
Obdobná varianta s asociativním polem
Vícerozměrná pole 2 Dvourozměrné pole 2
array("dist"=>0.39,"dia"=>0.38), "Venuse"=>array("dist"=>0.72,"dia"=>0.95), "Zeme" =>array("dist"=>1.0,"dia"=>1.0, "moons"=>("Měsíc")), "Mars" =>array("dist"=>1.52,"dia"=>0.53, "moons"=>array("Phobos","Deimos"))); //Vytiskne název druhého měsíce Marsu" print $planety["Mars"]["moons"][1]; ?>
4.5.
Pole a cyklus forech
Nejsnadnější způsob procházení neboli iterace v poli představuje příkaz cyklu foraech.
Příkaz foreach "; }
?>
Obrázek 2 Výsledek skriptu převodu cm na palce