The use statement with non-compound name ‚Nette‘ has no effect

- Mikulas Dite
- Člen | 756
Namespace takhle bohužel nefunguje. Musíš do use vypsat všechny třídy.
Druhá možnost je použít namespace Nette, což udělá to co
chceš, ale potom máš lepší používat prefixed verzi a jmenné prostory
nepoužívat.

- Panda
- Člen | 569
No ono to jde, ale smysl to má jen u souborů, které jsou v nějakém namespace. Pro lepší představu příklad:
namespace.php
<?php
namespace Test\Sub;
class Object
{
public function test()
{
echo __CLASS__;
}
}
test.php
namespace Test2\Sub2;
use Test;
include 'namespace.php';
$obj = new Test\Sub\Object();
$obj->test();
Takto je vše OK. Příkaz use Test; zapříčiní, že při
použití názvu Test\Sub\Object se hledá správný objekt a
nebere se relativní cesta vůči aktuálnímu namespace, tedy
Test2\Sub2\Test\Sub\Object. Pokud použijeme příkaz
Test\Sub, můžeme nový objekt vytvořit pomocí
new Sub\Object. Slouží to tedy jako jakýsi alias.
Pokud zakomentuješ namespace Test2\Sub2; v
test.php, generuje kód ten Tvůj warning. Skutečně ten
use v globálním namespace nemá smysl, vytvoříš si alias
Test pro namespace Test, ale to máš stejně
přístupné i tak. Pokud bys použil use Test\Sub; a
new Sub\Object, už to smysl má – namespace
Test\Sub přiřadíš alias Sub, tzn. jakoby si ho
vytáhneš. A přesně takto je to použito v Nette, aby nebylo potřeba ve
vnořených jmenných prostorech použivat \Nette\..., ale jen
Nette\....
Na závěr: použít takto use v globálním prostoru není
chyba, ale je to zbytečný řádek, který může být potenciálně
nebezpečný. PHP proto varuje: „nechtěl jsi udělat něco jiného?“.
// Doplnění: nenapsal jsem to zbytečně složitě? Kdyby to nebylo k pochopení, houkněte. :-)
Editoval Panda (30. 12. 2010 14:03)

- Mikulas Dite
- Člen | 756
Panda napsal(a):
No ono to jde, ale smysl to má jen u souborů, které jsou v nějakém namespace.
…
Příkaz use Test; zapříčiní, že při použití názvu Test\Sub\Object se hledá správný objekt a nebere se relativní cesta vůči aktuálnímu namespace.
Ale zmizí jenom to lomítko, místo aby se nemuselo psát ani to Test, jako u jinak řešených namespace.