Includování souborů v PHP: Která (funkce :-) je ta pravá?
Programujete-li v PHP, určitě znáte čtveřici funkcí
include
,
include_once
,
require
a
require_once
, které slouží ke vkládání PHP skriptů do sebe. V těch
mnoha megabajtech PHP kódu, co dnes po světě provětrávají servery, se běžně
vyskytují všechny čtyři. Kterou z těchto funkcí je tedy nejlepší použít ve vašem
kódu? S tím vám asi neporadím, ale můžu prozradit, co používám já – a proč.
Nejdřív volba mezi variantami "s once" a "bez once". Tahle volba je pro mě jednoznačná – vyhrává varianta "bez once". Tento způsob vkládání mě totiž donutí promyslet si vrstvy, ze kterých se můj program skládá, a pak do n-té vrstvy vkládat jen soubory z vrstvy n+1. Jen velmi obtížně tak vyrobím program, kde všechno závisí na všem a je to "tak nějak zamotané do sebe". Používání varianty "bez once" je podobně jako třeba checked exceptions v Javě takový malý bič na programátory, aby trochu víc přemýšleli, než začnou psát – s tím rozdílem, že tady je dobrovolný.
Následná volba mezi include
a require
je pro mě
spíš otázkou zvyku. Mezi oběma variantami je totiž jediný rozdíl – když
include
nenajde daný soubor, vyvolá chybu na úrovni E_WARNING
,
kdežto require
v tomto případě způsobí rovnou E_FATAL_ERROR
.
Pro mě druh chyby téměř nic neznamená. Chyba na jakékoliv úrovni je prostě chyba
a ukazuje, že můj program je špatně – v tomhle jsem nekompromisní. (A také tomu
přizpůsobuji nastavení serveru a ošetření chyb se svých skriptech.) Z toho
důvodu mi příliš nezáleží na tom, kterou z funkcí použiju – a protože jsem z
C/C++ zvyklý na klíčové slovo include
, používám ho i v PHP.
To je asi vše, co můžu k tomuto tématu říct. Pokud máte na probíraný problém nějaký jiný názor než tu prezentuji já, rád o něm uslyším v komentářích.
(Malá poznámka nesouvisející s hlavním tématem článku: Jsem přesvědčený, že za můj občas až perfekcionistický přístup k programování, který je asi z tohoto článku trochu cítit, může to, že jsem několik let programoval v Turbo/Borland/Object Pascalu, což je poměrně striktní a programátora v lecčems omezující jazyk. Myslím, že úkol, pro který byl tento jazyk vymyšlen – totiž výuka programování a jeho správných technik – u mě splnil téměř dokonale.)