14. díl - Tvorba vlastních funkcí v PHP

PHP Základní konstrukce Tvorba vlastních funkcí v PHP American English version English version

V minulém dílu seriálu tutoriálů se základy PHP jsme si představili a vyzkoušeli několik funkcí pro práci s textovými řetězci. V dnešním dílu si ukážeme, jak vytvářet vlastní funkce.

Tvorba vlastních funkcí

Zatím jsme pouze používali cizí funkce. Není ovšem nic těžkého vytvořit si funkci vlastní. Rozdělování skriptů do funkcí má následující výhody:

  • Přehlednost - Pokud se nějaký algoritmus skládá z více kroků, vytvoříme funkci pro každý tento krok a funkce potom voláme po sobě. Vezměme si např. náš emailový formulář z minulých lekcí. Ten zvalidoval zda bylo vše vyplněné a poté odeslal email. Vše bylo napsáno na jednom míste a zamotané do sebe. Správně bychom na daném místě měli volat jen funkci pro validaci a funkci pro odeslání. Každá funkce potom obsahuje jen to, co do ní patří. Kód se stává přehlednějším.
  • DRY (neopakujme se) - Zkratka DRY označuje Do not Repeat Yourself, tedy neopakujte se. Jedná se o uznávaný programátorský princip, který odsuzuje duplikovaný kód. Pokud chceme nějakou část kódu použít vícekrát, nemusíme ji opisovat, ale oddělíme ji do funkce. Poté pouze zavoláme jednu funkci na více místech programu. Když potom chceme v kódu něco opravit, nehledáme chybu na několika místech, ale opravíme ji jen v té jedné funkci.
  • Možnost použití knihoven - Funkce, které často používáte, můžete vkládat do samostatných souborů, kterým se někdy říká knihovny (anglicky library). Pokud si vytvoříte např. knihovnu pro přihlašování uživatelů, můžete ji potom jen vložit do jiného projektu, načíst a začít používat dané funkce, aniž byste něco znovu programovali.

Pozn.: V dalších seriálech si ukážeme i jak členit funkce do objektů. Dosáhneme tím opravdu velmi čitelného kódu, který lze navíc rozšiřovat.

Správný program by měl být poskládaný z několika kratších funkcí, neměl by vypadat jako dlouhá nudle kódu :)

Jednoduchá funkce

Vytvořme si úplně jednoduchou funkci, která jen něco vypíše. Funkci deklarujeme pomocí klíčového slova function. Za ním následuje název funkce (ten by měl být psaný camelCasem) a závorky. Tělo funkce je potom vloženo do bloku ze složených závorek.

Funkce by se měla jmenovat podle toho, co dělá. Měla by také dělat vždy jen jednu věc a pokud potřebujeme udělat 2 věci, vytvoříme si na to 2 funkce. Jako název funkce se mi osvědčilo používat sloveso v rozkazovacím způsobu (imperativu). Jakmile funkci někde deklarujeme, můžeme ji níže volat. Uděláme to jednoduše napsáním jejího názvu a závorek.

Následující kód vložíme kamkoli do PHP sekvence:

function pozdrav()
{
        echo('Vítejte na mém webu');
}

pozdrav();

Výsledek:

Vítejte na mém webu

Nahoře deklarujeme funkci, níže hotovou funkci zavoláme.

Funkci musíme pochopitelně vždy deklarovat nad místem, odkud ji voláme. PHP parsuje zdrojový kód od začátku do konce a pokud bychom to udělali naopak, narazilo by na volání funkce, o které si ještě "nepřečetlo".

Funkce s parametry

Funkci samozřejmě můžeme vložit i nějaké parametry. Na jednoduchém příkladu si ukažme funkci, která vypíše součet dvou čísel. Takto triviální funkci bychom v praxi sice nedeklarovali, ale jako příklad poslouží dobře a reálnou funkci si ukážeme na konci. Parametry vkládáme jako proměnné do závorky v hlavičce funkce a oddělujeme je čárkou.

function secti($a, $b)
{
        $soucet = $a + $b;
        echo("Součet: $soucet");
}

Funkci následně voláme takto:

secti(10, 20);

Při volání funkce můžeme do parametrů samozřejmě vložit i proměnné:

$a = $_POST['cislo1'];
$b = 20;
secti($a, $b);

Z funkcí nelze přistupovat k nějaké proměnné, která je definována mimo funkci. Ve funkci můžete přistupovat jen k proměnným, které přišly v parametru a maximálně k superglobálním polím, jako jsou $_GET a $_POST. Sice to jde obejít pomocí klíčového slova global, ale to nedělejte, jelikož taková funkce ztrácí smysl. Když něco nejde, má to většinou nějaký smysl a neměli bychom hledat způsob, jak obejít zákaz, ale jak to udělat správně :) Vše, co funkce potřebuje, jí jednoduše předáme ve vstupních parametrech.

Funkce s návratovou hodnotou

Funkce může také vracet nějakou hodnotu. V ukázkách výše jsme ve funkcích pouze vypisovali. V praxi se takovéto funkce příliš nepíší, jelikož nejsou univerzální. Představte si, že nechceme součet vypsat, ale použít ho jako mezivýsledek při dalším výpočtu. Proto funkce výslednou hodnotu většinou vrací. Tam, kde byla funkce volána, si s ní potom můžeme udělat co chceme. Funkce může vždy vrátit jen jednu hodnotu a jakmile ji vrátí, tak se na tom místě ukončí a další kód v ní se již neprovede. Hodnotu vracíme pomocí klíčového slova return.

Pokud potřebujeme vrátit více hodnot, můžeme vrátit pole, nebo si pro každou hodnotu vytvořit samostatnou funkci. Záleží na konkrétním případu.

Upravme naší sčítací funkci tak, aby výsledek místo vypisování vracela:

function secti($a, $b)
{
        $soucet = $a + $b;
        return $soucet;
}

Funkci bychom poté volali takto:

$soucet = secti(10, 20);
echo("Součet: $soucet");
echo("Dvojnásobek součtu: " . ($soucet * 2));

Vidíte, že když naše funkce hodnoty vrací, je naprosto univerzální a můžeme ji použít jak k výpisu, tak k další práci. Výsledek můžeme později uložit třeba do databáze, souboru, kamkoli.

Funkce na odesílání emailu

Jako velmi užitečná funkce je funkce k posílání emailů. Nyní máme již dostatek znalostí k tomu, abychom si takovou funkci napsali. Když se podíváme zpět na kód k odeslání emailu v našem formuláři, dáme dohromady následující funkci:

function odesliEmail($adresa, $predmet, $odesilatel, $zprava)
{
        $hlavicka = 'From:' . $odesilatel;
        $hlavicka .= "\nMIME-Version: 1.0\n";
        $hlavicka .= "Content-Type: text/html; charset=\"utf-8\"\n";
        $uspech = mb_send_mail($adresa, $predmet, $zprava, $hlavicka);
        return $uspech;
}

Funkce si připraví hlavičku na základě vstupních parametrů a tu potom předá funkci mb_send_mail(), která email odešle. Tato funkce vrátí hodnotu 0/1 podle toho, zda bylo odeslání úspěšné či nikoli. Toto hodnotu potom vrátíme i naší funkcí.

Volání funkce bude následující:

$uspech = odesliEmail('vas@email.cz', 'Test emailu', 'odesilatel@seznam.cz', 'Text zprávy');
if (!$uspech)
        echo('Email se nepodařilo odeslat, zkontrolujte adresu a odesílatele');

Určitě uznáte, že psát těch 5 řádků, co je nyní ve funkci, na každém místě, kde potřebujeme odeslat email, je minimálně zdržující a nepřehledné. Takhle napíšeme jen jeden řádek. Funkce však funguje jen v tom souboru, ve kterém je deklarována. Příště si ukážeme, jak zajistit, abychom funkci mohli používat úplně všude bez toho, abychom ji opisovali.


 

  Aktivity (2)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (7 hlasů) :
4.857144.857144.857144.857144.85714


 


Miniatura
Předchozí článek
Cvičení k 13. lekci PHP
Miniatura
Všechny články v sekci
Základní konstrukce jazyka PHP
Miniatura
Následující článek
Cvičení k 14. lekci PHP

 

 

Komentáře

Avatar
Tom
Neregistrovaný
Avatar
Tom:

Ahoj, v té předposlední funkci je drobná chybka v názvech, voláš funkci "soucet", ale definovaná je funkce "secti". Jinak super :)

 
Odpovědět 18.10.2013 22:15
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovědět 19.10.2013 10:19
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Martin Píštěk (Denir):

Ahoj, v příkladu funkce na odesílání emailu je přímo ve funkci deklarována proměnná $predmet, která obsahuje řetězec 'Nová zpráva z mailformu'. Když potom funkci voláme je tato proměnná v parametrech uvedena znova a v prikladu do ní vložíme řetězec 'Test emailu'. Která hodnota je potom pro funkci mb_send_mail() prioritní? Chápu to dobře, že pokud hodnotu při volání nezadáme, vezme si mb_send_mail() přednastavenou hodnotu, která je deklarována uvnitř funkce odesliEmail()?

 
Odpovědět 3.5.2014 21:00
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Martin Píštěk (Denir)
David Čápka:

Ten řádek s vyplněným předmětem tam byl navíc, už jsem to opravil :)

Odpovědět 24.7.2014 11:59
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na Martin Píštěk (Denir)
Martin Konečný (pavelco1998):

Nevím, jak to v příkladu bylo, ale pokud je parametru nastavena defaultní hodnota a při volání ji nevyplníš, použije se právě ta defaultní.

function vypisHodnotu($parametr = "hodnota")
{
  return $parametr;
}

echo vypisHodnotu();  // "hodnota"
echo vypisHodnotu("něco jiného");  // "něco jiného"

Problém u parametrů je v tom, že se nemusí vyplňovat jen v případě, že za nimi nenastavuješ jiné hodnoty.
Např. u funkce

function neco($param_1 = "neco", $param_2)
{
   // práce s $param_1 a $param_2
}

musíš hodnotu $param_2 určit vždycky. Protože je ale až na druhém místě, musíš ručně předat hodnotu i prvnímu parametru.

Editováno 24.7.2014 12:41
 
Odpovědět  +1 24.7.2014 12:40
Avatar
kivdul
Člen
Avatar
kivdul:

Ahoj,

šlo by přiložit pod článek soubor ke stažení :-)

po vytvoření funkce odeslaniEmailu(), úpravě parametrů, proměných je teď můj (v minulé kapitole ještě funkční) email zralý na Delete.

někde mám chybu a rád bych ji dohledal

děkuji Ludvík

 
Odpovědět 25.11.2015 6:29
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.