2009-12-20 10 views
17

Come trovare il nome file dello script che ha chiamato la mia funzione?Ricerca del nome file che ha chiamato la mia funzione in PHP

Ad esempio,

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

Potresti fornire maggiori informazioni sul perché e a quale scopo avresti bisogno di tale funzionalità y? Potrebbe essere che ti stai avvicinando a un problema dalla parte sbagliata. – Gordon

risposta

29

Una soluzione potrebbe essere quella di utilizzare la funzione debug_backtrace: nel backtrace, questo tipo di informazioni dovrebbe essere presente.

Oppure, come ha sottolineato Gordon in un commento, è anche possibile utilizzare debug_print_backtrace se si desidera solo produrre tali informazioni e non utilizzarle.


Ad esempio, con temp.php che contiene questo:

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

e con temp-2.php che contiene questo:

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


Calling temp.php(i.e. the first script) dal mio browser mi fa questa uscita:

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

In questo caso, ho il nome file "temp.php", che è quello in cui è stata chiamata la funzione.


Naturalmente, dovrete testare un po 'di più (soprattutto in situazioni in cui la funzione non è nel "primo livello" inclusi file, ma in un file incluso da un altro - non sono sicuro debug_backtrace aiuterà molto, lì ...); ma questo potrebbe aiutare a ottenere una prima idea ...

+0

Forse aggiungi anche debug_print_backtrace() alla risposta. – Gordon

+0

@Gordon: grazie per il suggerimento; Ho modificato la mia risposta per aggiungere quella :-) –

+0

Buona risposta. Semplifica la ricerca del file "calling" a partire dalla fine, cercando solo il primo file diverso ... – Franz

3

Oltre al suggerimento di Pascal Martins, è possibile installare l'estensione PECL APD e usare qualcosa come apd_callstack(), che (ad esempio citando)

// 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 

Ma dal momento che questa è un'estensione PECL e potrebbe interferire con Zend Optimizer, si potrebbe andare meglio con debug_backtrace().

0

È possibile passare il nome del file come parametro:

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

Quando si chiama la funzione si passa la magia costante FILE:

sthing(__FILE__); 
2

Prova questa:

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

Perfection. Funziona come previsto. – Dovy

+0

Funzionando bene su php 5.6. Grazie. –

Problemi correlati