2009-12-20 7 views
17

Wie finde ich den Dateinamen des Skripts heraus, das meine Funktion anrief?Herausfinden des Dateinamens, der meine Funktion in PHP anrief

Zum Beispiel

function sthing() { 
echo __FILE__; // echoes myself 
echo __CALLER_FILE__; // echoes the file that called me 
} 
+0

Könnten Sie bitte mehr Informationen darüber geben, warum und zu welchem ​​Zweck Sie solche Funktionen benötigen? y? Könnte sein, dass Sie ein Problem vom falschen Ende her nähern. – Gordon

Antwort

29

Eine Lösung könnte sein, die debug_backtrace Funktion zu nutzen: in der Backtrace, diese Art von Informationen sollte vorhanden sein.

Oder, wie Gordon in einem Kommentar darauf hingewiesen hat, können Sie auch verwenden, wenn Sie nur diese Informationen ausgeben und nicht damit arbeiten möchten.


Zum Beispiel mit temp.php diese enthalten:

<?php 
include 'temp-2.php'; 
my_function(); 

und mit temp-2.php diese enthalten:

<?php 
function my_function() { 
    var_dump(debug_backtrace()); 
} 


temp.php(i.e. the first script) von meinem Browser aufrufen wird mir diese Ausgabe:

array 
    0 => 
    array 
     'file' => string '/.../temp/temp.php' (length=46) 
     'line' => int 5 
     'function' => string 'my_function' (length=11) 
     'args' => 
     array 
      empty 

Dort habe ich den Dateinamen "" - das ist derjenige, in dem die Funktion aufgerufen wurde.


Natürlich werden Sie ein bisschen mehr (vor allem in Situationen testen müssen, wo die Funktion nicht in der „ersten Stufe“ ist Datei enthalten, aber in einer Datei durch eine andere enthalten - nicht sicher debug_backtrace wird viel helfen, da ...); aber dies könnte Ihnen helfen, einen ersten Eindruck bekommen ...

+0

Vielleicht fügen Sie debug_print_backtrace() auch zur Antwort hinzu. – Gordon

+0

@Gordon: danke für den Vorschlag; Ich habe meine Antwort bearbeitet, um diese hinzuzufügen :-) –

+0

Gute Antwort. Erleichtert das Suchen nach der "aufrufenden" Datei am Ende, einfach nach der ersten Datei suchen, die anders ist ... – Franz

3

Neben Pascal Martins Vorschlag, könnten Sie die PECL-Erweiterung installieren APD und verwenden Sie so etwas wie apd_callstack(), die (unter Angabe Beispiel)

// returns an array containing an array of arrays. 

Each array appears to contain: 
[0] = function name 
[1] = filename that contains function 
[2] = *calling* line number in *calling* file 
[3] = An array which is usually empty 

Aber da Dies ist eine PECL-Erweiterung und könnte den Zend Optimizer stören. Sie sollten besser mit debug_backtrace() arbeiten.

0

Sie den Dateinamen als Parameter übergeben können:

function sthing($filename) { 
    echo __FILE__; // echoes myself 
    echo $filename; // echoes the file that called me 
} 

Wenn Sie die Funktion aufrufen, übergeben Sie die magische Konstante FILE:

sthing(__FILE__); 
2

Versuchen Sie folgendes:

$key = array_search(__FUNCTION__, array_column(debug_backtrace(), 'function'))); 
var_dump(debug_backtrace()[$key]['file']); 
+0

Perfektion. Funktioniert wie erwartet. – Dovy

+0

In php 5.6 funktioniert alles richtig. Vielen Dank. –

Verwandte Themen