Trovare il file PHP (in fase di esecuzione) in cui è stata definita una classe


111

C'è qualche riflessione / introspezione / magia in PHP che ti permetterà di trovare il file PHP in cui è stata definita una particolare classe (o funzione)?

In altre parole, ho il nome di una classe PHP o di un oggetto istanziato. Voglio passare questo a qualcosa (funzione, classe Reflection, ecc.) Che restituisca il percorso del file system in cui è stata definita la classe.

/path/to/class/definition.php

Mi rendo conto che potrei usare ( get_included_files())per ottenere un elenco di tutti i file che sono stati inclusi finora e poi analizzarli tutti manualmente, ma è un sacco di accesso al file system per un singolo tentativo.

Mi rendo conto anche che potrei scrivere del codice aggiuntivo nel nostro meccanismo __autoload che memorizza queste informazioni da qualche parte. Tuttavia, la modifica del __autoload esistente è off limits nella situazione che ho in mente.

Sentire parlare di estensioni che possono farlo sarebbe interessante, ma alla fine mi piacerebbe qualcosa che possa essere eseguito su un'installazione "di serie".


2
Magento mi ha portato qui: -]
Alan

@alan bello vedere l'ortografia del nome di una proprietà lì.
Alan Storm

Risposte:


225

Provare ReflectionClass

Esempio:

class Foo {}
$reflector = new \ReflectionClass('Foo');
echo $reflector->getFileName();

Questo tornerà falsequando il nome del file non può essere trovato, ad esempio nelle classi native.


10

Per ReflectionClass in un file con spazio dei nomi , aggiungi un prefisso "\" per renderlo globale come segue:

$ riflettore = new \ ReflectionClass ('FOO');

Altrimenti, genererà un errore detto ReflectionClass in uno spazio dei nomi non definito. Non avevo il diritto di commentare la risposta sopra, quindi lo scrivo come risposta supplementare.


0

se avessi una cartella include, potresti eseguire un comando di script di shell su "grep" per "class $ className" facendo: $filename = ``grep -r "class $className" $includesFolder/*\e restituirebbe il file in cui si trovava. A parte questo, non penso ci sia alcuna magia funzione per PHP per farlo per te.


3
Una curiosità onesta e non stronza qui. Cosa ti ha fatto pensare che questa risposta fosse migliore dell'idea che avevo già considerato e rifiutato? "Mi rendo conto che potrei usare (get_included_files ()) per ottenere un elenco di tutti i file che sono stati inclusi fino ad ora e poi analizzarli tutti manualmente, ma è un sacco di accesso al file system per un singolo tentativo."
Alan Storm

perché è una riga anziché quante righe ci vorrebbero per scrivere un parser in PHP e la funzione grep è compilata in C, penso, e probabilmente molto più velocemente di qualsiasi cosa sarebbe stata scritta.
Seaux

Ah, capito. La mia vera preoccupazione era il ripetuto accesso al disco a ciascuno dei file più e più volte per farlo (è qualcosa che accadrà molto nello strumento che sto costruendo) e non la quantità di codice che cercherò di renderlo più chiaro in seguito tempo. (FYI: dovresti esaminare ack. È molto meglio di grep!)
Alan Storm

ack o awk? Adoro awk, in realtà è il mio linguaggio di programmazione preferito, ma più persone usano grep regolarmente ... è "più pulito" per cose così semplici
Seaux

Not awk, ack: betterthangrep.com È la sostituzione di grep perl back ottimizzata per progetti basati su codice di ricerca. È ottimo.
Alan Storm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.