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.