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

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
joseff
Člen | 233
+
0
-

Zdravim, mam soubor a ten zacina takto:

<?php
use Nette;

class MojeTrida ....

Ale neustale mi to vyhazuje tuto vyjimku? Vubec nevim proc, pouzivam php 5.3 tak proc nemuzu dat use Nette?
Diky

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

Mikulas Dite
Člen | 756
+
0
-

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.

joseff
Člen | 233
+
0
-

Ale vždyť přesně takto je to použito v samotném nette, například když se podívám do API např do třidy Template tak tam je taky na začátku napsáno use Nette. Tak jak je možné že tam to nevadilo? Nebo to tam také namá být? To je divné.

Panda
Člen | 569
+
0
-

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
+
0
-

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.

joseff
Člen | 233
+
0
-

To Panda: Je to dost složité, ale právě díky tomu jsem to pochopil, mnohokrát děkuji. Moc hezky vysvětleno.