web-dev-qa-db-fra.com

Recherche du fichier PHP (au moment de l'exécution) où une classe a été définie

Y a-t-il une réflexion/introspection/magie dans PHP qui vous permettra de trouver le fichier PHP où une classe (ou fonction) particulière a été définie?)

En d'autres termes, j'ai le nom d'une classe PHP, ou un objet instancié. Je veux le passer à quelque chose (fonction, classe Reflection, etc.) qui retournerait le chemin du système de fichiers où la classe a été définie.

/path/to/class/definition.php

Je me rends compte que je pourrais utiliser (get_included_files()) pour obtenir une liste de tous les fichiers qui ont été inclus jusqu'à présent, puis les analyser tous manuellement, mais cela représente beaucoup d'accès au système de fichiers pour une seule tentative.

Je réalise également que je pourrais écrire du code supplémentaire dans notre mécanisme __autoload qui cache ces informations quelque part. Cependant, la modification du __autoload existant est hors limites dans la situation à laquelle je pense.

Entendre parler des extensions qui peuvent le faire serait intéressant, mais j'aimerais finalement quelque chose qui puisse fonctionner sur une installation "stock".

99
Alan Storm

Essayez ReflectionClass

Exemple:

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

Cela renverra false lorsque le nom de fichier est introuvable, par exemple sur les classes natives.

208
Gordon

Pour ReflectionClass dans un fichier namespaced, ajoutez un préfixe "\" pour le rendre global comme suit:

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

Ou bien, il générera une erreur dite ReflectionClass dans un espace de noms non défini. Je n'avais pas le droit de faire de commentaire pour la réponse ci-dessus, donc j'écris ceci comme une réponse supplémentaire.

8
Jevin

si vous aviez un dossier includes, vous pouvez exécuter une commande de script Shell pour "grep" pour "class $ className" en faisant: $filename = ``grep -r "class $className" $includesFolder/*\ et il retournerait dans quel fichier il se trouvait. A part ça, je ne pense pas qu'il y ait de fonction magique pour PHP pour le faire pour vous.

0
Seaux