Ola,

Het volgende viel mij op.

Stel ik heb een class Bar in de global namespace en die wil ik aanroepen vanuit de namespace Foo.

<?php

namespace Foo;

$bar = new Bar;

?>
Het bovenstaande zal niet werken, omdat de autoloader nu op zoek gaat naar class Foo\Bar.

Het volgende werkt wel:

<?php

namespace Foo;

$bar = new \Bar;

?>
Nu wordt wel de class Bar geladen. Ja... ik weet wat je denkt... "Ja maar dat is toch logisch?"

Inderdaad, maar nu wordt het toch even wat vager. Dit werkt namelijk wel! Wie weet waarom?

<?php

namespace Foo;

$bar = 'Bar';
$bar = new $bar;

?>
Ik geef hier dus niet aan dat het om de root class Bar gaat, maar toch wordt de root class geladen, en niet de class Foo\Bar. Kan iemand uitleggen waarom dat zo is? Of is het een bug?
Strings moeten altijd de FQN (Fully Qualified Name) bevatten.
Als je vanaf de huidige namespace wilt werken kun je __NAMESPACE__ gebruiken om de FQN voor Foo\Bar op te bouwen.
Thanks Dos!

>> Strings moeten altijd de FQN (Fully Qualified Name) bevatten.

Je bedoelt met "string" dan eigenlijk de variabele? Weet je ook waarom dat zo is? Het is volgens mij de 1e keer dat ik in PHP iets tegenkom dat op deze manier werkt.

Je zou verwachten dat als je zegt:

$bar = 'Bar';
$bar = new $bar;

Dat ie dan vnuit de huidige namespace gaat kijken. Waarom doet ie dat niet vraag ik me af, terwijl als je dit doet:

$bar = new Bar;

dat ie dan wel vanuit dezelfde namespace kijkt. Best vreemd eigenlijk...


Nee ozzie, de string wordt opgeslagen in een variabele, maar het gaat om die string. Een variabele is geen type, het is alleen een stukje geheugen om iets op te slaan.

En waarom dat zo werkt? Vaak gebruik je strings voor classnamen als je iets configureert, in dat geval wil je niet dat de configuratie wordt beïnvloed door de context waarin hij wordt gebruikt. Vandaar dat het van de globale namespace werkt.
Oké, thanks Wouter. Ik kwam tot de ontdekking omdat ik voor m'n services in het config-bestand bij de class-namen geen slash had staan. En toen dacht ik, hoe kan het eigenlijk dat dat gewoon goed gaat. Nu begrijp ik het :)

Reageren