namespaces
Een vraagje over namespaces.
Stel ik heb een class in de onderstaande directory.
Nu zou ik de namespace van deze class zo kunnen noemen:
Echter, ik zou 'm ook zo kunnen:
Nu vraag ik me af of hier verschil tussen zit. Of komt het op hetzelfde neer?
Ozzie\Foo\Bar -> /Ozzie/Foo/Bar.php
Ozzie_Foo\Bar -> /Ozzie_Foo/Bar.php
Stel ik heb classes met deze namespaces:
namespace Ozzie\Foo;
namespace Ozzie\Bar;
namespace Ozzie\Bla;
Hebben deze classes dan de namespace "Ozzie" gemeenschappelijk? Dus, anders gezegd, bestaat de namespace "Ozzie\Foo" uit de namespace Ozzie en Foo. Of is "Ozzie\Foo" 1 namespace?
Gewijzigd op 07/10/2013 20:14:49 door Ozzie PHP
Ozzie\Foo is één namespace
Nee, Ozzie is een namespace en Foo is een subnamespace van Ozzie. Maar dat maakt niet echt veel verschil.
Wouter J op 07/10/2013 20:32:32:
Nee, Ozzie is een namespace en Foo is een subnamespace van Ozzie. Maar dat maakt niet echt veel verschil.
Als je use Ozzie\*; had kunnen doen zou ik het met je eens geweest zijn. Aangezien dat niet kan vind ik niet echt dat je het als subnamespace kunt geschouwen, maar meer als 1 geheel
Code (php)
En daarnaast ziet PHP het ook op deze manier: http://nl3.php.net/manual/en/language.namespaces.nested.php
Stel ik heb een class Ozzie\Foo\Bar\Foobar.php...
en ik zit in de namespace Ozzie;
Dan kan ik niet zeggen
use Foo\Bar\Foobar;
Maar dan moet ik het vanaf de root doen:
use Ozzie\Foo\Bar\Foobar;
Klopt dat wat ik zeg? En is dat ook wat jij bedoelt NOLot?
Wouter J op 07/10/2013 20:38:36:
Dat kun je doen:
En daarnaast ziet PHP het ook op deze manier: http://nl3.php.net/manual/en/language.namespaces.nested.php
Code (php)
En daarnaast ziet PHP het ook op deze manier: http://nl3.php.net/manual/en/language.namespaces.nested.php
Zie je die nutteloze overlapping van Foo? Als je new Bar\Cat had kunnen doen, dan kon je spreken over een sub
Toevoeging op 07/10/2013 20:45:04:
Ozzie PHP op 07/10/2013 20:38:59:
Oké, en als ik een class wil "usen" dan moet ik die altijd aanroepen vanaf de "root"?
Stel ik heb een class Ozzie\Foo\Bar\Foobar.php...
en ik zit in de namespace Ozzie;
Dan kan ik niet zeggen
use Foo\Bar\Foobar;
Maar dan moet ik het vanaf de root doen:
use Ozzie\Foo\Bar\Foobar;
Klopt dat wat ik zeg? En is dat ook wat jij bedoelt NOLot?
Stel ik heb een class Ozzie\Foo\Bar\Foobar.php...
en ik zit in de namespace Ozzie;
Dan kan ik niet zeggen
use Foo\Bar\Foobar;
Maar dan moet ik het vanaf de root doen:
use Ozzie\Foo\Bar\Foobar;
Klopt dat wat ik zeg? En is dat ook wat jij bedoelt NOLot?
use is altijd van de root, new vanaf de huidige namespace (als je niet met een \ begint)
NOLot - op 07/10/2013 20:44:01:
use is altijd van de root, new vanaf de huidige namespace (als je niet met een \ begint)
Allright, thanks!
Quote:
en ik zit in de namespace Ozzie;
Dan kan ik niet zeggen
use Foo\Bar\Foobar;
Maar dan moet ik het vanaf de root doen:
use Ozzie\Foo\Bar\Foobar;
Klopt dat wat ik zeg?
Dan kan ik niet zeggen
use Foo\Bar\Foobar;
Maar dan moet ik het vanaf de root doen:
use Ozzie\Foo\Bar\Foobar;
Klopt dat wat ik zeg?
Ja, dit klopt. Dat komt omdat use statements altijd vanaf de root werken, als je ze gewoon direct aan zou roepen kun je gewoon new Foo\Bar\Foobar(); doen, als je dan in de Ozzie namespace zat wordt de FQCN Ozzie\Foo\Bar\Foobar().
Quote:
Zie je die nutteloze overlapping van Foo? Als je new Bar\Cat had kunnen doen, dan kon je spreken over een sub
Maar dat is dus een groot verschil tussen het PHP namespacing systeem en iets als Java. In Java worden bij een import (use) de klassen/namespaces in de huidige namespace geimporteerd, in PHP hebben we het alleen over het aliassen van namespaces.
Dus ja, als PHP op dezelfde manier had gewerkt als Java's import dan zou wat jij nu zegt kunnen.
Trouwens Ozzie, dit had je ook wel zelf snel kunnen uitzoeken hè?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
set_spl_autoloader('var_dump');
namespace Ozzie {
use Foo\Bar;
new Bar();
new Kit\Cat();
}
?>
set_spl_autoloader('var_dump');
namespace Ozzie {
use Foo\Bar;
new Bar();
new Kit\Cat();
}
?>
Gewijzigd op 07/10/2013 20:48:23 door Wouter J
Ik heb het nu al een keer of 5 gelezen en ik snap nog steeds niet wat je bedoelt :)
Voer mijn code uit en je weet wat ik bedoel
Wat ik bedoelde was... als ik in namespace Ozzie zit, en ik wil Ozzie\Foo\Bar usen, dat ik dan niet kan zeggen "Foo\Bar" (en dat ie dan zelf daar Ozzie\Foo\Bar van maakt). Hij pakt use altijd vanuit de root.
Ja, en ik vertelde dat als je het doet zonder use, je dan wel relatief vanuit de huidige namespace werkt, tenzij je \ ervoor plaatst
Ja, oké, ik snap je nu. Maar als je dan wilt zeggen use ... as ... moet je dus de namespace vanuit de root gebruiken :)
Ben eens even gaan kijken en vond een mooie, maar ook een eenvoudige uitleg over namespacing. :)
Misschien dat je er je voordeel mee kunt doen: https://laracasts.com/lessons/namespacing-primer
Toevoeging op 11/10/2013 14:33:54:
Ik heb het filmpje bekeken. Lekker duidelijk, dus was de moeite waard!
Als je binnen een class een andere class wilt gebruiken die buiten de huidige namespace valt, wat heeft dan jouw voorkeur?
Optie A:
Code (php)
Optie B:
Optie B is echt de best practise.
Oké... optie B it is! Thanks Wouter.