13 Stimmen

Ermitteln der __FILE__-Konstante für den Aufrufer einer Funktion in PHP

Ich kenne die __FILE__ magische Konstante in PHP verwandelt sich in den vollständigen Pfad und Dateinamen der aktuell ausgeführten Datei. Aber gibt es eine Möglichkeit, die gleichen Informationen für die aufrufende Datei einer Funktion zu erhalten? Zum Beispiel:

//foo.php:
include "bar.php";
call_it();

//bar.php
function call_it() {
    echo "Calling file: ".__CALLING_FILE__;
}

die Folgendes ausgeben würde Calling file: ....../foo.php .

Ich weiß, es gibt keine __CALLING_FILE__ magische Konstante oder eine magische Konstante, um dies zu handhaben, aber gibt es eine Möglichkeit, wie ich diese Informationen erhalten kann? Die am wenigsten hackish Lösung wäre ideal (z. B. mit einem Stack-Trace wäre ziemlich hacky), aber am Ende muss ich nur es zu arbeiten.

34voto

RageZ Punkte 25926

Sollten Sie einen Blick auf den Stack-Trace werfen, um solche Dinge zu tun. PHP hat eine Funktion namens debug_backtrace

include "bar.php";
call_it();

//bar.php
function call_it() {
   $bt =  debug_backtrace();

   echo "Calling file: ". $bt[0]['file'] . ' line  '. $bt[0]['line'];
}

Ich hoffe, es hilft

Nach dem gleichen Prinzip könnte man debug_print_backtrace nützlich ist, tut es dasselbe, aber php übernimmt das Formatieren und Drucken aller Informationen selbst.

3voto

Ivan Krechetov Punkte 18174

debug_backtrace() ist Ihr Freund

Das ist es, was wir verwenden, um den vollständigen Stack-Trace für die aktuell Linie. Um sie an Ihren Fall anzupassen, ignorieren Sie den oberen Teil der $trace Array.

class Util_Debug_ContextReader {
    private static function the_trace_entry_to_return() {
        $trace = debug_backtrace();

        for ($i = 0; $i < count($trace); ++$i) {
            if ('debug' == $trace[$i]['function']) {
                if (isset($trace[$i + 1]['class'])) {
                    return array(
                        'class' => $trace[$i + 1]['class'],
                        'line' => $trace[$i]['line'],
                    );
                }

                return array(
                    'file' => $trace[$i]['file'],
                    'line' => $trace[$i]['line'],
                );
            }
        }

        return $trace[0];
    }

    /**
     * @return string
     */
    public function current_module() {
        $trace_entry = self::the_trace_entry_to_return();

        if (isset($trace_entry['class']))
            return 'class '. $trace_entry['class'];
        else
            return 'file '. $trace_entry['file'];

        return 'unknown';
    }

    public function current_line_number() {
        $trace_entry = self::the_trace_entry_to_return();
        if (isset($trace_entry['line'])) return $trace_entry['line'];
        return 'unknown';
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X