Podpora namespace byla do PHP pridana par verzi zpatky kvuli nasledujicimu problemu:
Pokud pouzivate vice knihoven ve vasem projektu, je dost caste, ze narazite dve tridy, ktere by mohly mit stejny nazev. Traba Factory, User, Authenticator,... Dve takove tridy nemohly vedle sebe v PHP existovat a nebyla moznost, jak specifikovat, kterou tridu z ktere knihovny chcete pouzit. Aby se tomu programatori vyhnuli pouzivali jmene konvence. Takze napr. v Zend Frameworku se vsechny tridy jmenovaly nejak takhle Zend_Db_Driver_Mysql_Connector_Select (to jsem si ted vymyslel, ale princip byl takovyhle), Nette pouzivalo napr. Nette_Form_TextInput a podobne.
Namespaces tento problem odstranuji. Z Nette_Form_TextInput se vam stane jenom TextInput a porovnejte pouziti:
pred:
$textInput1 = new Nette_Form_TextInput();
$textInput2 = new Nette_Form_TextInput();
$textInput3 = new Nette_Form_TextInput();
po:
use \Nette\Form\TextInput;
$textInput1 = new TextInput();
$textInput2 = new TextInput();
$textInput3 = new TextInput();
Kazdopadne vyhody poznate sam. V PHP to bohuzel nebylo dotazeno k dokonalosti (alespon ve verzi 5.2, s kterou jsem naposledy delal). Napr oproti Jave neni pravidlo, ze jeden soubor = jedna class, takze nebylo mozne vystacit pouze s konstrukci "use", ale navic bylo nutne definovat soubory ukecaneji. Presneji:
<?php
include("soubor-s-tridou-TextInput.php");
use \Nette\Form\TextInput;
$textInput1 = new TextInput();
$textInput2 = new TextInput();
$textInput3 = new TextInput();
?>
Takze na zacatku kazdeho souboru musela byt nejen definice use, ale jeste include. Tady opet nastupuji frameworky, ktere toto resi. Vetsinou tak, ze jim nakonfigurujete nejakou root slozku (/home/programator/projekt) a oni pod ni hledaji vsechny php soubory a spojuji je dohromady, aby se programator mohl vyhnout definici include.