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 :)
Citace od: rooobertek kdy 29. 05. 2014, 16:22:24
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;
Citace od: Eat sleep kdy 30. 05. 2014, 02:08:51
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.