namespaces
Ola,
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?
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?
Ja, hier zit verschil tussen. Als je die PSR-0 standard nou eens gaat lezen weet je dat de _ niet wordt omgezet in een directory.
Ozzie\Foo\Bar -> /Ozzie/Foo/Bar.php
Ozzie_Foo\Bar -> /Ozzie_Foo/Bar.php
Ozzie\Foo\Bar -> /Ozzie/Foo/Bar.php
Ozzie_Foo\Bar -> /Ozzie_Foo/Bar.php
Ik bedoel het eigenlijk anders... het gaat me niet om het omzetten... het gaat me erom of het iets anders betekent. Uhmm... hoe leg ik dat uit...
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?
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
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
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?
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
"...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()."
Ik heb het nu al een keer of 5 gelezen en ik snap nog steeds niet wat je bedoelt :)
Ik heb het nu al een keer of 5 gelezen en ik snap nog steeds niet wat je bedoelt :)
Hehe, sorry... :)
Voer mijn code uit en je weet wat ik bedoel
Voer mijn code uit en je weet wat ik bedoel
Ik denk dat ik wel begrijp wat je bedoelt te zeggen, het staat er alleen een beetje krom ;)
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.
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 :)
Ozzie, ik weet niet of je het nu helemaal doorhebt met namespacing, maar vond net in mijn mail een announce van mijn beste vriend Jeffrey Way dat de laracast website is gelanceerd.
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
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
Hoi Bart, het is me (denk ik) wel duidelijk nu. Desalniettemin ga ik zeker de link in jouw video even bekijken, want dan kan het alleen nog maar duidelijker worden. Hartelijk dank voor de tip!!
Toevoeging op 11/10/2013 14:33:54:
Ik heb het filmpje bekeken. Lekker duidelijk, dus was de moeite waard!
Toevoeging op 11/10/2013 14:33:54:
Ik heb het filmpje bekeken. Lekker duidelijk, dus was de moeite waard!
Korte vraag...
Als je binnen een class een andere class wilt gebruiken die buiten de huidige namespace valt, wat heeft dan jouw voorkeur?
Optie A:
Optie B:
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:
Natuurlijk optie B. Daardoor kun je makkelijk en snel het namespace aanpassen en kun je gaan aliasen.
Optie B is echt de best practise.
Optie B is echt de best practise.
Oké... optie B it is! Thanks Wouter.




