2009-04-13 11 views
5

¿Ustedes saben cómo puedo determinar a partir de qué archivo se llamó una función dentro de esa función?Determine dónde se ha llamado una función con PHP

Yo estaba pensando en usar debug_backtrace .. pero que no se ve como una manera elegante de hacerlo, y también enumarate otras razones en otra pregunta here

Entonces, ¿qué otras alternativas existen?

muchas gracias

+0

¿Por qué necesita saber de dónde la función actual ha sido llamado? Como dice la pregunta vinculada, debe reconsiderar su diseño si sus funciones realmente necesitan saber quién los llamó. – Gumbo

+0

tengo una clase de vista y no quiero especificar la ruta completa de la vista ... sino solo el nombre y el resultado para que la vista se ubique en el mismo directorio que la vista que llamó a la clase. –

+0

Parece que está a punto de dispararle el pie. No hagas eso. – troelskn

Respuesta

2

Desde dentro de la función debug_backtrace() es la única manera de determinar la persona que llama, a menos que, por supuesto, se pasa esa información como parámetro.

Tenga en cuenta que no se puede utilizar valores predeterminados para hacer esto. Ej .:

function f($param1, $param2, $caller=__FUNCTION__) ... 

__FUNCTION__ serán evaluados en tiempo de análisis, por lo que siempre tendrá el mismo valor. La función en la que se declara el alcance f.

3

Tomé prestado este código hace algún tiempo desde algún lugar y funciona como un encanto usando debug_backtrace(). Espero que lo encuentres útil:

function backtrace(){ 
    $backtrace = debug_backtrace(); 

    $output = ''; 
    foreach ($backtrace as $bt) { 
     $args = ''; 
     foreach ($bt['args'] as $a) { 
      if (!empty($args)) { 
       $args .= ', '; 
      } 
      switch (gettype($a)) { 
       case 'integer': 
       case 'double': 
        $args .= $a; 
        break; 
       case 'string': 
        //$a = htmlspecialchars(substr(, 0, 64)).((strlen($a) > 64) ? '...' : ''); 
        $args .= "\"$a\""; 
        break; 
       case 'array': 
        $args .= 'Array('.count($a).')'; 
        break; 
       case 'object': 
        $args .= 'Object('.get_class($a).')'; 
        break; 
       case 'resource': 
        $args .= 'Resource('.strstr($a, '#').')'; 
        break; 
       case 'boolean': 
        $args .= $a ? 'TRUE' : 'FALSE'; 
        break; 
       case 'NULL': 
        $args .= 'Null'; 
        break; 
       default: 
        $args .= 'Unknown'; 
      } 
     } 
     $output .= '<br />'; 
     $output .= '<b>file:</b> '[email protected]$bt['file'].' - line '[email protected]$bt['line'].'<br />'; 
     $output .= '<b>call:</b> '[email protected]$bt['class'][email protected]$bt['type'][email protected]$bt['function'].'('.$args.')<br />'; 
    } 
    return $output; 
} 
+0

estoy buscando una alternativa para usar la función debug_backtrace. –

+1

Entonces creo que debería reformular su pregunta, ya que entendí que su problema era que debug_backtrace estaba presentando su salida fea. De todos modos, no creo que haya una alternativa simple a debug_backtrace ... – Seb

1

No tendrás muchas opciones allí. La otra opción (la cual fue publicada en la otra pregunta) para obligar a la persona que llama a provde es la información con la llamada de función (usando PHP constantes mágicas):

callFunction(1, 2, 3, __FUNCTION__) 
callFunction(1, 2, 3, __CLASS__, __METHOD__) 
callFunction(1, 2, 3, $this, __METHOD__) 

    or 

$class = new ReflectionClass(__CLASS__); 
$method = $class->getMethod(__METHOD__); 
callFunction(1, 2, 3, $method) // $method would be a ReflectionMethod obj 

habría una alternativa posible. Pero es

  • ofuscar su código
  • puede ser "manipulados", que podría hacer que el código de callFunction a fallar y que sería muy difícil realizar un seguimiento de los errores hacia abajo.

Si estuviera en su lugar, trataría de evitarlo en una función que se utiliza a lo largo de su código. use debug_backtrace (incluso si puede ser 'lento'). El código legible gana el código rápido.

0

Si esto se realiza con fines de depuración, puede lanzar una excepción e imprimir las llamadas a la pila de llamadas donde lo atrapa.

3

¡Las respuestas de la tripulación de mickey mouse son típicas de la comunidad de PHP en línea! En lugar de compartir la respuesta, te preguntan por qué podrías necesitarla. No importa el hecho de que Solomongaby haga una pregunta válida y es una característica bastante normal tener en IDE estándar y en lenguajes más profesionales como Java y Objective-C.

Solomongaby, esta es la forma más sencilla de conseguir lo que necesita:

$bt = debug_backtrace(); 
$end = end($bt); 
var_dump($end['class']); //or var_dump($end['file']); 
Cuestiones relacionadas