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.)