Spojování a volání skriptů skripty v PHP

Ač se to může zdát podivné, mnoho PHP vývojářů nezná rozdíly mezi funkcemi, které slouží ke spojování skriptů - include, include_once, require a require_once. V tomto článku bych rád uvedl alespoň některé důležité rozdíly, které mohou ovlivnit výběr správné funkce. Protože tyto funkce opravdu nejsou navzájem aliasy.

Include

Include je základní vkládací funkce. Funguje tak, že se v původním skriptu rádek s include nahradí obsahem includovaného souboru. Jeden soubor je možno vkládat opakovaně a pokaždé je vložen na místo includu. Užitečné například při tvorbě layoutu, pro vkládání dílčích bloků stránky (hlavička, menu, etc.). Pokud se pokusíte includovat neexistující soubor, PHP vyhodí warning, ale zpracování skriptu pokračuje. Pokud budeme mít skript a.php s následujícím obsahem:

<?php
echo \"zacatek skriptu\";
include(\"neexistujici-soubor.php\");
echo \"Konec skriptu\";
?>

výsledkem jeho spuštění bude následující výstup:

Zacatek skriptu
Warning: include(neexistujici-soubor.php) [function.include]: failed to open stream: No such file or directory in /home/sniper/php-projekty/bordel/a.php on line 6
Warning: include() [function.include]: Failed opening \'neexistujici-soubor.php\' for inclusion (include_path=\'.:/usr/local/lib/php\') in /home/sniper/php-projekty/bordel/a.php on line 6
konec skriptu

Require

Narozdíl od includu, který pouze říka \"Rád bych zde měl obsah tohoto souboru\", říká funkce require \"Zde musí být obsah následujícího souboru.\" Pokud není rozdíl patrný, určitě bude z výstupu skriptu a.php, pokud nahradíme include za require:

Zacatek skriptu
Warning: require(neexistujici-soubor.php) [function.require]: failed to open stream: No such file or directory in /home/sniper/php-projekty/bordel/a.php on line 13
Fatal error: require() [function.require]: Failed opening required \'neexistujici-soubor.php\' (include_path=\'.:/usr/local/lib/php\') in /home/sniper/php-projekty/bordel/a.php on line 13

Jak vidíte, pokud se pokusíte načíst pomocí require neexistující soubor (nebo soubor, ke kterému nemáte práva), místo druhého warningu vyhodí PHP fatal error a běh skriptu se zastaví. Toto chování se hodí, pokud načítáte soubor s funkcemi, konfiguraci nebo třeba třídy, prostě souborů nezbytných pro běh aplikace.

Include_once a require_once

Nevýhodou funkcí include a require je, že jsou nahrazeny obsahem vkládaného souboru pokaždé, co jsou volány. Toto chování je občas žádané, občas ale může být problémem. Například se může stát, že budete jednu třídu vkládat na více místech a při použití klasického include nebo require dojde k chybě při pokusu o předeklaraci funkcí a třídy. Z tohoto důvodu existují funkce (require|include)_once. Pokud voláte tyto funkce, PHP interpret se nejdříve podívá, jestli jste tyto soubory již někde nevkládali. Pokud ano, tyto funkce a tím i duplicitní vložení ignoruje. Upravme soubor a.php následovně:

<?php
include_once(\"b.php\");
include_once(\"b.php\");
?>

a vytvořme soubor b.php s následujícím obsahem:

<?php echo "toto je soubor b.php"; ?> 

Pokud tentokrát zavoláte skript a.php, nebude výsledkem

toto je soubor b.phptoto je soubor b.php

ale pouze

toto je soubor b.php

Skript b.php se vloží jenom jednou a tím dojde k volání echa pouze jednou. Pokud bychom použili normální include/require, výsledkem by bylototo je soubor b.phptoto je soubor b.phpRozdíl v chování v případě nepřístupného souboru u require_once a include_once je stejný jako u include a require.Includování souborů je v dnešní době nutnost. Pokud bychom chtěli napsat celý projekt do jediného souboru, jakákoliv práce s ním by se rychle stala noční můrou. Bohužel, začínající vývojáři velmi často tento krok řeší bez znalosti rozdílů vkládacích funkcí, což má často za následek divné chyby oznamující pokus o předeklaraci funkcí.

Vloženo dne 22. 04. 2008       Přidat do záložek na jagg.czPřidat do záložek na linkuj.cz

Diskuse