2009-11-26 9 views
10

Sé que la constante mágica __FILE__ en PHP se convertirá en la ruta completa y el nombre de archivo del archivo que se está ejecutando actualmente. Pero, ¿hay alguna manera de obtener la misma información para el archivo de llamadas de una función? Por ejemplo:Obtenga la constante __FILE__ para la función que llama en PHP

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

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

que daría salida a Calling file: ....../foo.php.

Sé que no hay __CALLING_FILE__ constante mágica, o una constante mágica para manejar esto, pero ¿hay alguna manera de que pueda obtener esa información? La solución menos hackish sería ideal (por ejemplo, usar un rastro de pila sería bastante raro) pero al final solo necesito que funcione.

+3

deseé esto se podría hacer w/o backtracing – Geo

Respuesta

21

debería echar un vistazo al rastro de pila para hacer tales cosas. PHP tiene una función llamada 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']; 
} 

creo que sirve

en el mismo principio se puede encontrar debug_print_backtrace útil, hacer las mismas cosas, pero php manejar el formateo e impresión de toda la información por sí mismo.

+0

bien, así que supongo que la utilidad de seguimiento de la pila de PHP es más amigable de lo que esperaba que fuera, y esto parece ser la forma más limpia de hacer lo que quiera. –

3

debug_backtrace() es su amigo

Eso es lo que usamos para volcar la traza completa de la actual línea de. Para ajustarlo a su caso, ignore la parte superior de la matriz $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'; 
    } 
} 
Cuestiones relacionadas