Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: JanJan 29. 05. 2014, 15:21:38

Název: K čemu je dobré use v PHP
Přispěvatel: 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.

Kód: [Vybrat]
$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".

Kód: [Vybrat]
use \Adresar;
$class1 = new Class1;
$class2 = new Class2;
$class3 = use Class3;
To ovšem nefunguje. Musím to psát takto.

Kód: [Vybrat]
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í...
Název: Re:K čemu je dobré use v PHP
Přispěvatel: student 29. 05. 2014, 16:10:31
To mas presne ako import v Jave - ked by si napr. Class1 spominal castejsie, tak ta pisanie celeho nazvu skoro prejde.
Název: Re:K čemu je dobré use v PHP
Přispěvatel: rooobertek 29. 05. 2014, 16:22:24
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 :)
Název: Re:K čemu je dobré use v PHP
Přispěvatel: JanJan 29. 05. 2014, 17:19:01
Fix imports (ctrl+shift+i) to vyrieši.
A co přesně vyřeší ?
Název: Re:K čemu je dobré use v PHP
Přispěvatel: repli2dev 29. 05. 2014, 17:55:33
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.
Název: Re:K čemu je dobré use v PHP
Přispěvatel: perceptron 29. 05. 2014, 18:03:56
som tiez javak, ale ak to napisete takto (use na vrchu), tak to zacne davat zmysel. pisanie 'use' na preskacku vyplyva z nepochopenia

Kód: [Vybrat]
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
Název: Re:K čemu je dobré use v PHP
Přispěvatel: JanJan 29. 05. 2014, 18:42:42
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...
Název: Re:K čemu je dobré use v PHP
Přispěvatel: Natix 29. 05. 2014, 19:00:37
Já sice PHP taky neznám, ale tohle:

Kód: [Vybrat]
use \Adresar\Foo;

$x = new Foo;
$y = new Foo;
$z = new Foo;

... mi přijde poněkud lepší než:

Kód: [Vybrat]
$x = new \Adresar\Foo;
$y = new \Adresar\Foo;
$z = new \Adresar\Foo;
Název: Re:K čemu je dobré use v PHP
Přispěvatel: none_ 29. 05. 2014, 20:43:59
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.
Název: Re:K čemu je dobré use v PHP
Přispěvatel: none_ 29. 05. 2014, 21:04:00
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.
Název: Re:K čemu je dobré use v PHP
Přispěvatel: Eat sleep 30. 05. 2014, 01:53:15
je to hnus ako vsetko v PHP v normalnych jazykoch funguju nejmspejsi obnoho intuitivnejsie (presne jak si napisal v prvom poste)
Název: Re:K čemu je dobré use v PHP
Přispěvatel: Eat sleep 30. 05. 2014, 02:08:51
Ale toto by tusim malo fungovat ak sa dobre pamatam (v php som uz davno nerobil)

Kód: [Vybrat]
use \Namespace;

$class1 = new \Class1;
$class2 = new \Class2;
$class3 = new \Class3;
Název: Re:K čemu je dobré use v PHP
Přispěvatel: Kit 01. 06. 2014, 08:50:53
Ale toto by tusim malo fungovat ak sa dobre pamatam (v php som uz davno nerobil)

Kód: [Vybrat]
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:
Kód: [Vybrat]
use \Namespace;

$object1 = new \Class1;
$object2 = new \Class2;
$object3 = new \Class3;
Takhle to samozřejmě nefunguje, viz ostatní komentáře.