Ho notato che quando utilizzo il namespacing il caricamento delle classi in modo dinamico non funziona come quando le sto caricando staticamente. Così, per esempio, senza l'uso di spazi dei nomi qui di seguito sono equivalenti nella loro azione di istanziare una classe denominata FooBar
:Il caricamento dinamico delle classi non può indirizzare lo spazio dei nomi/
$foobar = new FooBar();
e
$classname = "FooBar";
$foobar = new $classname;
Tuttavia, se quando si utilizza namespacing ho qualche codice come questo :
<?php
namespace Structure\Library;
$foobar = new UserService();
$classname = "UserService";
$barfoo = new $classname;
In questo caso il nome completo della classe UserService
è Structure\Library\UserService
e se uso il pieno qua il nome completo funziona in entrambi i casi, ma se utilizzo solo il nome di scelta rapida di 'UserService'
, lo solo funziona quando viene istanziato con il metodo statico. C'è un modo per farlo funzionare per entrambi?
P.S. Sto utilizzando un caricatore automatico per tutte le classi ... ma suppongo che il problema stia succedendo prima del il caricatore automatico e sta effettuando la stringa di classe che viene passata al caricatore automatico.
Confuso da ", funziona solo se istanziato con il metodo statico". Dove stai usando uno statico '::'? Comprendere la comprensione di ['Global Space'] (http://www.php.net/manual/en/language.namespaces.global.php)? – ficuscr
No, mi spiace, intendevo il riferimento statico alla classe non una "classe statica". : ^) Esplicitamente, la riga che dice '$ foobar = new UserService();' – ken
Puoi mostrarci la logica del tuo autoloader? Immagino che all'interno, tu usi lo spazio dei nomi per calcolare il percorso da cui caricare il file di classe. È giusto? Non puoi 'echo' il tuo nome' $ class' all'interno del caricatore automatico, per darci un indizio migliore? Come ha risposto Allender, immagino che quello che sta succedendo è che il nome della classe in elaborazione includa lo spazio dei nomi in una istanza, ma non lo include in un'altra. Essenzialmente, l'ultima riga del tuo codice è simile alla scrittura: '$ barfoo = new \ UserService();', che fallisce, perché la classe non è nello spazio dei nomi globale. – cartbeforehorse