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

111

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

En d'autres termes, j'ai le nom d'une classe PHP, ou d'un objet instancié. Je veux passer cela à quelque chose (fonction, classe Reflection, etc.) qui renverrait 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 c'est beaucoup d'accès au système de fichiers pour une seule tentative.

Je me rends également compte que je pourrais écrire du code supplémentaire dans notre mécanisme __autoload qui met en cache ces informations quelque part. Cependant, la modification du __autoload existant est interdite dans la situation que j'ai à l'esprit.

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

Alan Storm
la source
2
Magento m'a amené ici: -]
Alan
@alan est bon de voir une orthographe de nom de propriété là-bas.
Alan Storm

Réponses:

225

Essayer ReflectionClass

Exemple:

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

Cela reviendra falselorsque le nom de fichier est introuvable, par exemple sur les classes natives.

Gordon
la source
10

Pour ReflectionClass dans un fichier à espace de noms , ajoutez un préfixe "\" pour le rendre global comme suit:

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

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

Jevin
la source
0

si vous aviez un dossier d'inclusion, vous pourriez exécuter une commande de script shell vers "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 magie fonction pour que PHP le fasse pour vous.

Seaux
la source
3
Curiosité honnête et non-connard ici. Qu'est-ce qui vous a fait penser que cette réponse était meilleure que l'idée que j'avais déjà envisagée et rejetée? "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 c'est beaucoup d'accès au système de fichiers pour une seule tentative."
Alan Storm
parce que sa seule ligne par opposition au nombre de lignes qu'il faudrait pour écrire un analyseur en PHP et que la fonction grep est compilée en C, je pense, et probablement beaucoup plus rapidement que ce qui aurait été écrit.
Seaux
Ah, compris. Ma préoccupation réelle était l'accès répété au disque à chacun des fichiers encore et encore pour le faire (c'est quelque chose qui se produira souvent dans l'outil que je construis) et non la quantité de code que j'essaierai de clarifier ensuite temps. (FYI: Vous devriez regarder dans ack. C'est bien meilleur que grep!)
Alan Storm
ack ou awk? J'adore awk, c'est en fait mon langage de programmation préféré, mais de plus en plus de gens utilisent grep régulièrement ... c'est "plus propre" pour des trucs aussi simples
Seaux
Not awk, ack: betterthangrep.com C'est le remplacement de perl back grep qui est optimisé pour les projets basés sur le code de recherche. C'est bien.
Alan Storm