Ich habe festgestellt, dass wenn ich Namespacing verwende, das Laden von Klassen dynamisch nicht so funktioniert, wie wenn ich sie statisch lade. So zum Beispiel, ohne die Verwendung von Namensräumen der folgenden äquivalent sind in ihrer Wirkung eine Klasse instanziieren genannt FooBar
:Dynamisches Laden von Klassen kann Namespace nicht adressieren/verwenden
$foobar = new FooBar();
und
$classname = "FooBar";
$foobar = new $classname;
Wenn jedoch bei der Verwendung von Namespacing Ich habe einige Code wie diesen :
<?php
namespace Structure\Library;
$foobar = new UserService();
$classname = "UserService";
$barfoo = new $classname;
In diesem Fall
die vollständig qualifizierte Namen der UserService
Klasse sind Structure\Library\UserService
und wenn ich die voll qua verwenden lificed Name funktioniert es in beiden Fällen, aber wenn ich nur den Namen der Verknüpfung 'UserService'
es nur funktioniert, wenn instanziiert mit der statischen Methode. Gibt es einen Weg, um es für beide zu arbeiten?
P.S. Ich benutze einen Autoloader für alle Klassen ... aber ich nehme an, dass das Problem vor der Autoloader passiert und die Klassenzeichenfolge bewirkt, die an den Autoloader übergeben wird.
Verwirrt von, "es funktioniert nur, wenn mit der statischen Methode instanziiert". Wo benutzt du ein statisches '::'? Verständnis von ['Global Space'] (http://www.php.net/manual/en/language.namespaces.global.php)? – ficuscr
Es tut mir leid, ich meinte die statische Referenz auf die Klasse nicht eine "statische Klasse". : ^) Explizit die Zeile '$ foobar = new UserService();' – ken
Kannst du uns die Logik deines Autoloaders zeigen? Ich stelle mir vor, dass Sie den Namespace verwenden, um den Pfad zu berechnen, von dem die Klassendatei geladen werden soll. Ist das richtig? Kannst du deinen Namen '$ class' nicht innerhalb des Autoloaders" echo "nennen, um uns einen besseren Hinweis zu geben? Wie Allender geantwortet hat, stelle ich mir vor, dass der verarbeitete Klassenname den Namespace in einer Instanz enthält, ihn aber nicht in einer anderen enthält. Im Wesentlichen ähnelt die letzte Zeile Ihres Codes dem Schreiben: '$ barfoo = new \ UserService();', was fehlschlägt, weil die Klasse nicht im globalen Namespace ist. – cartbeforehorse