Suchen der PHP-Datei (zur Laufzeit), in der eine Klasse definiert wurde

110

Gibt es eine Reflexion / Selbstbeobachtung / Magie in PHP, mit der Sie die PHP-Datei finden können, in der eine bestimmte Klasse (oder Funktion) definiert wurde?

Mit anderen Worten, ich habe den Namen einer PHP-Klasse oder eines instanziierten Objekts. Ich möchte dies an etwas (Funktion, Reflection-Klasse usw.) übergeben, das den Dateisystempfad zurückgibt, in dem die Klasse definiert wurde.

/path/to/class/definition.php

Mir ist klar, dass ich verwenden könnte ( get_included_files())um eine Liste aller bisher enthaltenen Dateien zu erhalten und sie dann alle manuell zu analysieren, aber das ist viel Dateisystemzugriff für einen einzigen Versuch.

Mir ist auch klar, dass ich zusätzlichen Code in unseren __autoload-Mechanismus schreiben könnte, der diese Informationen irgendwo zwischenspeichert. Das Ändern der vorhandenen __autoload ist jedoch in der Situation, an die ich denke, verboten.

Es wäre interessant, über Erweiterungen zu hören, die dies können, aber ich möchte letztendlich etwas, das auf einer "Standard" -Installation ausgeführt werden kann.

Alan Storm
quelle
2
Magento brachte mich hierher: -]
Alan
@ Alan gut zu sehen, einige Eigenschaften Name Rechtschreibung dort.
Alan Storm

Antworten:

225

Versuchen ReflectionClass

Beispiel:

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

Dies wird zurückgegeben, falsewenn der Dateiname nicht gefunden werden kann, z. B. in nativen Klassen.

Gordon
quelle
10

Fügen Sie für ReflectionClass in einer Datei mit Namespace ein Präfix "\" hinzu, um es wie folgt global zu machen:

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

Andernfalls wird ein Fehler generiert, der als ReflectionClass in einem nicht definierten Namespace bezeichnet wird. Ich hatte kein Recht, einen Kommentar für die obige Antwort abzugeben, daher schreibe ich dies als ergänzende Antwort.

Jevin
quelle
0

Wenn Sie einen Includes-Ordner hätten, könnten Sie einen Shell-Skriptbefehl ausführen, um "grep" für "class $ className" auszuführen, indem $filename = ``grep -r "class $className" $includesFolder/*\Sie Folgendes ausführen: und er würde zurückgeben, in welcher Datei er sich befindet. Abgesehen davon glaube ich nicht, dass es Magie gibt Funktion für PHP, um es für Sie zu tun.

Seaux
quelle
3
Ehrliche, nicht arschlochige Neugier hier. Warum dachten Sie, diese Antwort sei besser als die Idee, die ich bereits in Betracht gezogen und abgelehnt hatte? "Mir ist klar, dass ich (get_included_files ()) verwenden könnte, um eine Liste aller bisher enthaltenen Dateien abzurufen und sie dann alle manuell zu analysieren, aber das ist eine Menge Dateisystemzugriff für einen einzigen Versuch."
Alan Storm
weil es eine Zeile ist, im Gegensatz zu wie vielen Zeilen, die zum Schreiben eines Parsers in PHP benötigt werden, und die grep-Funktion C kompiliert ist, denke ich, und wahrscheinlich viel schneller als alles, was geschrieben worden wäre.
Seaux
Ah, verstanden. Mein eigentliches Anliegen war der wiederholte Zugriff auf die einzelnen Dateien auf die einzelnen Dateien, um dies zu tun (dies wird in dem von mir erstellten Tool häufig vorkommen), und nicht die Menge an Code, die ich als Nächstes klarer machen möchte Zeit. (FYI: Sie sollten in ack schauen. Es ist viel besser als grep!)
Alan Storm
ack oder awk? Ich liebe awk, es ist eigentlich meine Lieblingsprogrammiersprache, aber mehr Leute benutzen regelmäßig grep ... es ist "sauberer" für so einfache Sachen
Seaux
Nicht awk, ack: betterthangrep.com Es ist ein Perl-Back-Grep-Ersatz, der für auf Suchcode basierende Projekte optimiert ist. Es ist toll.
Alan Storm