K čemu je dobré use v PHP

JanJan

K čemu je dobré use v PHP
« kdy: 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í...


student

Re:K čemu je dobré use v PHP
« Odpověď #1 kdy: 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.

Re:K čemu je dobré use v PHP
« Odpověď #2 kdy: 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 :)

JanJan

Re:K čemu je dobré use v PHP
« Odpověď #3 kdy: 29. 05. 2014, 17:19:01 »
Fix imports (ctrl+shift+i) to vyrieši.
A co přesně vyřeší ?

repli2dev

Re:K čemu je dobré use v PHP
« Odpověď #4 kdy: 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.


perceptron

Re:K čemu je dobré use v PHP
« Odpověď #5 kdy: 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

JanJan

Re:K čemu je dobré use v PHP
« Odpověď #6 kdy: 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...

Natix

Re:K čemu je dobré use v PHP
« Odpověď #7 kdy: 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;

none_

Re:K čemu je dobré use v PHP
« Odpověď #8 kdy: 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.

none_

Re:K čemu je dobré use v PHP
« Odpověď #9 kdy: 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.

Eat sleep

Re:K čemu je dobré use v PHP
« Odpověď #10 kdy: 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)

Eat sleep

Re:K čemu je dobré use v PHP
« Odpověď #11 kdy: 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;

Kit

Re:K čemu je dobré use v PHP
« Odpověď #12 kdy: 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.