Die Parameter, über die ich spreche, sind __FILE__
und __LINE__
- diejenigen des Aufrufers der Funktion, so dass die Funktion sie in der Fehlerberichterstattung verwenden kann.
Nehmen wir an, ich habe zwei Dateien und Zeile 100 von file_1.php ruft my_func()
in file_2.php
Ich möchte diesen Aufruf my_func(__FILE__, __LINE__)
ausführen, damit, wenn my_func
einen Fehler feststellt, dieser in Zeile 100 gegen file_1.php gemeldet werden kann.
Das mache ich, weil es Hunderte von Aufrufen von my_func
gibt und die Meldung, dass der Fehler in my_func () selbst enthalten ist, ist möglicherweise nicht informativ (es sei denn, ich lade den Stapel ab). Und ich möchte diese zwei Parameter nicht ein paar hundert Mal manuell eingeben müssen.
In C würde ich etwas wie #define MY_FUNC my_func(__FILE, __LINE)
machen - kann ich etwas Ähnliches in PHP machen?
Leider hat PHP keine Makros. Sie könnten diese selbst implementieren, indem Sie ein Befehlszeilen-Tool wie sed
über eine Eingabe ausführen, um Makros einzufügen, aber das ist fehleranfällig und ein wenig schlampig.
Um zu tun, was Sie tun möchten, können Sie die Funktion debug_backtrace in Betracht ziehen.
Nein. Verwenden Sie einen Stack-Trace: debug_backtrace () . Sie können die Datei und die Zeile des Aufrufers abrufen, indem Sie einfach auf die zweite Zeile im zurückgegebenen Array schauen.
Leider gibt es kein C wie Macros in PHP.
Das Lesen einer debug_backtrace ist knifflig und das gefällt mir nicht.
Was ich möchte eine Ausnahme an Fehlerpunkten werfen dann Ausnahme-Objekt es selbst enthält die Stack-Trace sowie die Zeilennummer und die Datei, aus der es kommt.
%Vor%Sie können C-ähnliche Makros mit Hilfe des Quellschreibens replizieren.
Schreibe Datei macro.php
:
Jetzt mit diesem Tool ist die Verwendung einfach:
%Vor%Bei ausgeführten Ausgaben:
0.5 DEBUG_INFO: FILE : /var/tmp/test.php.pr; LINE : 7
INF DEBUG_INFO: FILE : /var/tmp/test.php.pr; LINE : 8
NAN DEBUG_INFO: FILE : /var/tmp/test.php.pr; LINE : 9
Ich habe starken C-Hintergrund und verpasste immer C-ähnliche Makros in PHP. Aber hoffentlich können wir eine Art Ersatz dafür anbieten.