2011-12-16 7 views
5

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?

+1

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

+1

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

+0

@Corbin Il codice evento è sicuramente caricato. In caso contrario, '$ x = new Event()' fallirebbe, giusto? – rybosome

risposta

5

Non è necessario codificare nel codice, è possibile utilizzare il nome della variabile:

$class_name = 'Event'; 
if (!in_array($class_name, get_declared_classes())) { 
    $x = new $class_name(); 
}; 

Vedi codice simile in azione qui: codepad.org/hCLE4ToA.

Anche alcune classi potrebbero non essere visualizzate nel risultato di get_declared_classes(), perché potrebbero non essere caricate al momento in cui viene chiamata questa funzione. Potrebbe essere il caso se sono caricati automaticamente dopo aver provato a istanziarli. Vedi di più sulle classi di autoloading qui: php.net/autoload.

Risponde ad alcune delle vostre domande? È stato d'aiuto?

+0

In realtà non sto cercando di fare l'esempio che ho elencato.Questo è stato più dimostrativo di come il nome della classe che desidero non compaia nella lista come mi aspetterei, eppure è disponibile per l'istanziazione. – rybosome

+1

@Ryan: sei sicuro che sia disponibile per l'istanziazione non perché è caricato automaticamente quando si tenta di istanziarlo? In altre parole: sei sicuro che la classe sia stata definita prima di aver chiamato 'get_declared_classes()'? – Tadeck

+0

Eri corretto, l'autoloading era il colpevole. – rybosome

Problemi correlati