2009-11-26 17 views
10

So che la costante magica __FILE__ in PHP diventerà il percorso completo e il nome file del file attualmente in esecuzione. Ma c'è un modo per ottenere le stesse informazioni per il file di chiamata di una funzione? Ad esempio:Ottieni la costante __FILE__ per il chiamante di una funzione in PHP

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

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

che emetterebbe Calling file: ....../foo.php.

So che non esiste una costante magica __CALLING_FILE__ o una costante magica per gestirlo, ma esiste un modo per ottenere tali informazioni? La soluzione meno hacker sarebbe l'ideale (ad esempio l'uso di una traccia di stack sarebbe un po 'hacky) ma alla fine ho solo bisogno che funzioni.

+3

ho voluto questo potrebbe essere fatto w/o backtracing – Geo

risposta

21

si dovrebbe dare un'occhiata alla traccia dello stack per fare queste cose. PHP ha una funzione chiamata 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']; 
} 

Speranza che aiuta

sullo stesso principio si potrebbe trovare debug_print_backtrace utile, fare le stesse cose, ma php gestire la formattazione e la stampa di tutte le informazioni da solo.

+0

bene, quindi suppongo che l'utilità traccia dello stack PHP è più amichevole di quanto mi aspettavo che fosse, e questo sembra essere il modo più pulito per fare quello che voglio. –

3

debug_backtrace() è tuo amico

Questo è quello che usiamo per scaricare la traccia dello stack completo per la corrente di linea . Per adattarlo al tuo caso, ignora la parte superiore dell'array $trace.

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'; 
    } 
} 
Problemi correlati