V 8. dílu seriálu o PHP se bude mluvit o funkcích a se vším, co s tím souvisí.
Funkce - úvod
Funkce jsou v podstatě malé kusy skriptů, které je možné opakovaně používat. To je asi nejjednodušší vysvětlení, co jsou to funkce. Ale musí se k tomu postupně přidat spoustu dalšího výkladu, aby to bylo košér. Pro nejrychlejší pochopení to chce asi první praktický příklad:
<html>
<head>
<title>Příklad 1. z 8. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
function pozdrav()
{
echo "Ahoj!<br>";
}
pozdrav();
pozdrav();
?>
</body>
</html>
Jak je v příkladu vidět, každá funkce začíná klíčovým slovem function. Za slovem function je název funkce. Každá funkce je pojmenovaná, funkce v našem příkladu se jmenuje pozdrav. Za jménem funkce jsou kulaté závorky. V našem případě jsou prázdné, ale uvnitř mohou být parametry, jak uvidíme dále.
Protože funkce jsou jenom v podstatě kusy skriptu, je potřeba někam ten kus skriptu zapsat. Ten se zapisuje mezi levou složenou závorku { a pravou složenou závorku }. Může tam být libovolná řada příkazů, v našem případě je tam pouze příkaz echo, který vypíše "Ahoj!".
Pod funkcí v našem příkladu je potom dvakrát použita naše funkce s názvem ahoj. Název funkce v podstatě znamená, že jsme získali nový příkaz s názvem pozdrav. Použijeme jej tak, že napíšeme jméno funkce, a za něj kulaté závorky. Jako každý příkaz je pak potřeba ukončit vše středníkem.
Když to shrnu, funkce se sestává ze dvou částí. První část, to je to, co je za klíčovým slovem function až do konce pravé složené závorky }, a to se nazývá definice funkce. Tím určujeme, co funkce vůbec bude provádět. Druhá část je volání funkce. To je ten zápis pozdrav();, který způsobuje, že dojde k vykonání toho malého kousku skriptu.
V našem případě každé volání funkce pozdrav vypíše ahoj. Protože voláme funkci pozdrav dvakrát, vykoná se dvakrát i ten malý kousek skriptu v definici funkce pozdrav. Protože v definici funkce pozdrav je vypsání textu "Ahoj!", vypíše se tedy dvakrát i tento text.
Funkce jsou nesmírně užitečnými pomocníky zejména pro zpřehledňování kódu. Kromě toho umožňují napsat určitou činnost jenom jednou, ale nechat vykonat mnohokrát.
Funkce - parametry
Uvedl jsem funkci pozdrav, ale funkci je možné předat i nějaké hodnoty, tzv. parametry. V následujícím příkladě předám funkci dvě čísla a funkce s názvem sečti vypíše jejich součet.
<html>
<head>
<title>Příklad 2. z 8. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
function sečti($a, $b)
{
echo $a, " + ", $b, " = ", $a+$b, "<br>";
}
sečti(1,2);
sečti(3,4);
?>
</body>
</html>
V tomto příkladě je tedy funkce sečti, která má dva parametry pojmenované jako $a, $b. Jak je vidět, parametry se zapisují do kulatých závorek za název funkce a oddělují se čárkami. Parametry jsou v podstatě proměnné, proto pro jejich pojmenování a další používání platí všechna pravidla jako pro proměnné.
Funkce sečti tedy dostane při svém volání dvě čísla. První čísla se jakoby uloží do proměnné s názvem $a, druhé číslo se uloží jakoby do proměnné $b. Uvnitř funkce se s proměnnými $a, $b může zacházet jako s proměnnými.
V definici funkce sečti se vypíše text, který ukazuje, která dvě čísla se sčítají a výsledek. Na konci je volání funkce sečti. Nejdříve voláme funkci sečti, abychom se dozvěděli, kolik je 1+2, ve druhém volání potom 3+4.
Celé to funguje tak, že při volání funkce sečti(1,2) se vytvoří dočasně dvě proměnné. Proměnná $a dostane hodnotu čísla 1 a proměnná $b dostane hodnotu čísla 2. Pak proběhne ten malý kousek skriptu uvnitř definice funkce sečti. Po vykonání jsou obě proměnné zrušeny.
Pochopení toho, jak pracují funkce s parametry je velmi důležité. Takové funkce se vyskytují v PHP velmi často. Skoro není možné programovat v PHP a nenapsat žádnou funkci s parametry. A ten hlavní důvod je, že i samotné PHP obsahuje spoustu zabudovaných funkcí už v sobě. K mnoha věcem v PHP se není možné dostat jinak, než přes funkce s parametry. Dokonce i v našem seriálu jsme funkce PHP už použili, například funkci die v 5. díle seriálu, nebo funkci date ve 3. díle seriálu.
Příkaz return - předčasné ukončení funkce
Příkaz return je možné použít uvnitř definice funkce, a nebo mimo ni. Pokud se použije uvnitř definice funkce, pak dojde k ukončení funkce, a další příkazy v definici funkce už se nevykonávají. Pokud se použije mimo definice funkce, dojde k ukončení vykonávání souboru, o tom viz 7. díl seriálu a příkaz include.
Příklad trochu složitější funkce vyděl je v následujícím příkladu. Jak jistě víte, nulou se dělit nedá, a tak následující příklad se postará, aby k tomu nedošlo:
<html>
<head>
<title>Příklad 3. z 8. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
function vydel($a, $b)
{
if ($b == 0)
return;
echo $a, " / ", $b, ` = `, $a/$b, "<br>";
}
vydel(10,5);
vydel(2,0);
vydel(100,4);
?>
</body>
</html>
Funkce vyděl pracuje podobně jako předchozí funkce sečti. V definici funkce vyděl jsou vidět dva parametry s názvy $a, $b, což jsou dvě čísla, která se potom vydělí. Na rozdíl od funkce sečti je funkce vyděl maličko složitější. Nejdříve se totiž ptáme, jestli platí podmínka, že $b, tedy druhé číslo, je rovno nule. Pokud tato podmínka platí, dělíme nulou, a to se nesmí. Pak tedy raději vykonáme příkaz return, tedy ukončení funkce. Tak jsme se postarali o to, že v případě dělení nulou se funkce vyděl předčasně ukončila.
Dále zavoláme funkci vyděl třikrát, ale pokud si skript spustíme, uvidíte jen dva výsledky. Druhé použití funkce vyděl totiž vede k dělení nulou, a tak dojde k předčasnému ukončení funkce vyděl příkazem return.
Funkce strlen - počet znaků řetězce
V této části chci demonstrovat, že funkce umí taky vracet hodnoty. Použiji k tomu tentokrát funkci strlen, kterou nemusím definovat, protože patří do sady funkcí zabudovaných přímo v PHP. Funkce strlen očekává jeden parametr, a to řetězec, a celá její činnost spočívá v tom, že nám řekne, kolik má řetězec znaků. Zde je příklad použití:
<html>
<head>
<title>Příklad 4. z 8. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
$kolik = strlen("Ahoj");
echo $kolik, "<br>";
echo strlen("Nazdar");
?>
</body>
</html>
Zajímavý je tento řádek:
$kolik = strlen("Ahoj");
Ten vezme řetězec "Ahoj", který je předán jako parametr do funkce strlen. Funkce strlen spočítá, kolik má znaků a zjistí, že celkem čtyři znaky. Výsledek ovšem nikam nevypisuje, ale namísto toho ho vrátí jako hodnotu funkce. Takže v proměnné $kolik zůstane číslo 4.
Další zajímavý řádek je:
echo strlen("Nazdar");
Tady máme řetězec "Nazdar", který je předán funkci strlen jako parametr. Ten zjistí, že se jedná o šestiznakový řetězec. Výslednou hodnotu ale rovnou vypisujeme příkazem echo, který vypíše šestku.
Z toho vidíme, že existuje možnost, aby funkce vrátila hodnotu. Jak se to dělá, se dozvíme dále.
Příkaz return - vrácení hodnoty funkce
Příkaz return slouží k předčasnému ukončení funkce. Ale to je jen jedna část jeho funkce. Ve skutečnosti příkaz return slouží i k vrácení hodnoty. Každá funkce totiž může vracet hodnotu, ale blíže viz další příklad, který počítá násobení trochu jinak, než v předchozích příkladech:
<html>
<head>
<title>Příklad 5. z 8. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
function vynásob($a, $b)
{
return $a * $b;
}
$výsledek = vynásob(2,3);
echo $výsledek, "<br>";
echo vynásob(4,5);
?>
</body>
</html>
Začnu s vysvětlením od konce, tedy od volání funkce vynásob. Jedna z řádků v příkladu je tato:
$výsledek = vynásob(2,3);
Zavolám prostě funkci vynásob pro vynásobení 2x3 a výsledek uložím proměnné $výsledek. Vypadá to celkem přirozeně. Další taková řádka je:
echo vynásob(4,5);
Vynásobím prostě 4x5 a výsledek rovnou vypíšu příkazem echo.
Myslím si, že takto to vypadá celkem přirozeně. Teď jde o to ještě funkci naučit, jakou hodnotu funkce vrátí. A to se dělá právě příkazem return. Pokud za příkaz return zapíšu jakoukoli hodnotu, nebo výraz, určím tím, jakou hodnotu vrátí funkce.
Zkusme teď jiný, mnohem jednodušší příklad, který nám vrátí Ludolfovo číslo π, které má hodnotu asi 3.14:
<html>
<head>
<title>Příklad 6. z 8. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
function p()
{
return 3.141592653589;
}
echo "Pi = ", p(), "<br>";
?>
</body>
</html>
Zde je krásně vidět příkaz return, který vrací hodnotu přímo v akci. Funkce s jednopísmenným názvem p při každém zavolání vrací hodnotu Ludolfova čísla π.
Musím se přiznat k tomu, proč jsem funkci pojmenoval jenom p. Je to proto, že přímo PHP už má v sobě funkci s názvem pi, která funguje naprosto stejně jako naše funkce p, tedy vrací hodnotu Ludolfova čísla π. Můžete tedy funkci pi přímo používat ve svých skriptech.
Funkce mt_rand - náhodné číslo
V podstatě to nejzákladnější o funkcích jsem už vysvětlil. Pokud umíte dobře pracovat s funkcemi, máte velkou část PHP světa k dispozici, protože to, co je zabudováno v PHP s námi komunikuje hlavně pomocí funkcí. Pokud si pořídíte oficiální manuál PHP zjistíte, že je tam popsána velká spousta funkcí, kterou můžete využívat ve svých skriptech. Dokážou opravdu kde co, od odeslání mailu, práce se soubory, různé matematické, grafické, textové a další funkce.
Jako malou demonstraci jsem připravil příklad, který vypíše náhodné oslovení. Tedy přesněji nevypíše náhodné oslovení, ale náhodně vybere jednu ze dvou možností oslovení. K tomu se používá funkce mt_rand, která už je zabudována přímo v PHP. Funkce mt_rand vrací náhodné číslo, má 2 parametry, a to minimální a maximální číslo z rozsahu, který má vrátit. A teď ten příklad:
<html>
<head>
<title>Příklad 7. z 8. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
$náhodné_číslo = mt_rand(1,2);
if ($náhodné_číslo == 1)
echo "Ahoj frajere!";
else
echo "Ahoj kamaráde!";
?>
</body>
</html>
Základem celého příkladu je řádek:
$náhodné_číslo = mt_rand(1,2);
Ten použije funkci mt_rand k tomu, aby vrátil náhodné číslo v rozsahu od jedné do dvou (parametry jsou čísla 1 a 2). Protože funkce mt_rand vrátí jen celá čísla, tak náhodně vrátí buď číslo jedničku, nebo dvojku.
Hned za tím je konstrukce if, která otestuje, jestli náhodné číslo je rovno jedničce. Pokud podmínka platí, vypíše se "Ahoj frajere!", jestli podmínka neplatí, vypíše se "Ahoj kamaráde!".
Pokud si tento příklad budete zkoušet, spusťte ho alespoň pětkrát po sobě. Zjistíte, že někdy vám vypíše jednu možnost, někdy druhou, podle náhody.
Poznámka na závěr
Rád bych dodal, že ačkoli tento díl seriálu postihuje snad to nejdůležitější o funkcích, není zde ještě vše, co by bylo dobré o funkcích napsat. Ale vzhledem k rozsahu jsem se rozhodl navázat v některém z dalších dílů.