Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: JanJan 29. 05. 2014, 15:21:38
-
Ahoj, pronikám do tajů "namespace" v php a nějak nechápu "use".
Při použití namespace volám třídy.
$class1 = new \Adresar\Class1;
$class2 = new \Adresar\Class2;
$class3 = use \Adresar\Class3;
Abych nemusel pořád psát celou cestu, chtěl jsem použít pro ulehčení "use".
use \Adresar;
$class1 = new Class1;
$class2 = new Class2;
$class3 = use Class3;
To ovšem nefunguje. Musím to psát takto.
use \Adresar\Class1;
$class1 = new Class1;
use \Adresar\Class2;
$class2 = new Class2;
use \Adresar\Class3;
$class3 = use Class3;
Tak to mi teda fakt usnadní prácí, a ta čitelnost kódu, opravdu žasnu. Nebo je to úplnš jinak ? Díky za objasnění...
-
To mas presne ako import v Jave - ked by si napr. Class1 spominal castejsie, tak ta pisanie celeho nazvu skoro prejde.
-
Ak používaš netbeans, nemusí ťa to trápiť. Fix imports (ctrl+shift+i) to vyrieši. Podobná funkcia je v rôznych IDE, len stačí nepoužívať stredoveké nástroje ako notepad alebo pspad :)
-
Fix imports (ctrl+shift+i) to vyrieši.
A co přesně vyřeší ?
-
Přečtěte si dokumentaci: http://www.php.net/manual/en/language.namespaces.importing.php
Pak byste třeba zjistil, že "use \Address\Subaddress" zpřístupní pouze tento jmenný prostor a je potřeba dále používat "Subaddress\Class1". Samozřejmě nic nebrání si zpřístupnit celé názvy tříd a pak používat jen "Class1". Ale to už je na vás.
-
som tiez javak, ale ak to napisete takto (use na vrchu), tak to zacne davat zmysel. pisanie 'use' na preskacku vyplyva z nepochopenia
use \Adresar\Class1;
use \Adresar\Class2;
use \Adresar\Class3;
$class1 = new Class1;
$class2 = new Class2;
$class3 = use Class3;
tie importy spravia presne to, ze automaticky za vas nahadzu na zaciatok zdrojaku 'use' deklaracie
-
Hm, pořád ale nevím, co má teda "use" přesně dělat, patrně něco nastavuje, ale nevím co, kde a pro jaký kód...
-
Já sice PHP taky neznám, ale tohle:
use \Adresar\Foo;
$x = new Foo;
$y = new Foo;
$z = new Foo;
... mi přijde poněkud lepší než:
$x = new \Adresar\Foo;
$y = new \Adresar\Foo;
$z = new \Adresar\Foo;
-
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.
-
Tak uz jsem se docetl, jak to ty PHP frameworky delaji, aby clovek nemusel furt psat include nebo require. Existuje funkce __autoload(). Vice zde http://www.php.net/manual/en/language.oop5.autoload.php.
-
je to hnus ako vsetko v PHP v normalnych jazykoch funguju nejmspejsi obnoho intuitivnejsie (presne jak si napisal v prvom poste)
-
Ale toto by tusim malo fungovat ak sa dobre pamatam (v php som uz davno nerobil)
use \Namespace;
$class1 = new \Class1;
$class2 = new \Class2;
$class3 = new \Class3;
-
Ale toto by tusim malo fungovat ak sa dobre pamatam (v php som uz davno nerobil)
use \Namespace;
$class1 = new \Class1;
$class2 = new \Class2;
$class3 = new \Class3;
Proč to všichni píší tak hloupě? Výsledkem přece není třída, ale instance. Proto by příklad měl vypadat takto:
use \Namespace;
$object1 = new \Class1;
$object2 = new \Class2;
$object3 = new \Class3;
Takhle to samozřejmě nefunguje, viz ostatní komentáře.