Mi piacerebbe ottenere i nomi di tutte le classi all'interno di uno spazio dei nomi specifico in PHP. Attualmente sto provando a fare magie tramite la riflessione su un elenco specifico di classi nominate, ma mi piacerebbe farlo senza conoscere i nomi prima del tempo.In PHP, c'è un modo per ottenere tutte le classi dichiarate in uno spazio dei nomi specifico?
Ho provato a chiamare get_declared_classes()
, ma per qualsiasi motivo, le classi che ho a disposizione non vengono visualizzate. Posso chiamare get_declared_classes()
, non vedere Event
nell'elenco, quindi chiamare immediatamente $x = new Event()
senza problemi. Qualcosa come il seguente, che direi che dovrebbe causare un problema ...
if (! in_array('Event', get_declared_classes())) { $x = new Event(); }
... funziona bene. Mi chiedo se il namespacing di queste classi e il recupero in questo modo aiuterebbero ad alleviare il problema. È possibile?
MODIFICA: per chiarimenti, aggiungo che attualmente non utilizzo spazi dei nomi e non sto specificatamente cercando di ottenere qualcosa dal codice sopra elencato. Quello che voglio è ottenere i nomi di tutte le classi che ho dichiarato. Nonostante il fatto che le dichiarazioni di classe per tutti loro vengano colpite prima di chiamare lo get_declared_classes()
, non compaiono tutte nell'elenco. Speravo che il namespace potesse aiutare a risolvere il problema.
EDIT2: Diverse persone hanno sottolineato che le classi possono essere caricate automaticamente. Ho provato questo facendo quanto segue. echo(class_exists('Event'))
ha restituito un valore di 1
. echo(class_exists('Event', FALSE))
ha restituito un valore pari a 0. Il secondo parametro facoltativo di class_exists è se autorizzare o meno. Quindi, a quanto pare la classe viene caricata automaticamente. Questo risponde a questo.
Quindi, la prossima domanda: come posso evitare questo? Sto usando un framework che in realtà non mi dà molto controllo a basso livello. C'è un modo per forzare l'autoloading, POI chiamare get_declared_classes
o get_declared_classes
per attivare prima un caricamento automatico?
In questo scenario in cui get_declared_classes non contiene eventi, è stato caricato il codice evento? In altre parole, è stato incluso il file che contiene la dichiarazione di classe di Event (o altrimenti definito nel flusso di codice)? – Corbin
Non mi sono preso la briga di testare, ma penso che questo potrebbe essere perché hai fatto riferimento a un NS con un'istruzione use e il nome della classe nell'array sta per essere Completamente qualificato con lo spazio dei nomi. In questo modo, mentre 'new Event' potrebbe funzionare proprio in riferimento a' \ Some \ OtherNamespace \ Event'. – prodigitalson
@Corbin Il codice evento è sicuramente caricato. In caso contrario, '$ x = new Event()' fallirebbe, giusto? – rybosome