2011-07-14 15 views
6

¿Puedo acceder al alcance del entorno de llamada desde dentro de una función llamada?¿Obtener alcance de llamada en una función de PHP?

Por ejemplo, me gustaría tener acceso a __LINE__ en una función de registro, pero tiene que ser __LINE__ desde el entorno de llamadas. También me gustaría tener alguna forma de llamar al get_defined_vars() para obtener las variables de las personas que llaman.

En ambos ejemplos ahorra tener que tener un argumento adicional.

¿Esto es posible?

+1

Si * pudieras * hacer esto, eventualmente te darías cuenta de la mala idea que es (de todos modos, fuera del registro). – Nicole

+0

@Renesis: No solo eso. Ser capaz de obtener el alcance de la llamada sería completamente contrario al propósito de pasar los parámetros. – pyon

+0

No creo que sea posible obtener las variables definidas en los marcos de pila debajo del superior. – GWW

Respuesta

0

No hay forma de obtener las variables de las personas que llaman, pero puede obtener sus argumentos. Esto se hace fácilmente con debug_backtrace():

<?php 

class DebugTest 
{ 
    public static function testFunc($arg1, $arg2) { 
     return self::getTrace(); 
    } 

    private static function getTrace() { 
     $trace = debug_backtrace(); 
     return sprintf(
      "This trace function was called by %s (%s:%d) with %d %s: %s\n", 
      $trace[1]["function"], 
      $trace[1]["file"], 
      $trace[1]["line"], 
      count($trace[1]["args"]), 
      count($trace[1]["args"]) === 1 ? "argument" : "arguments", 
      implode(", ", $trace[1]["args"]) 
     ); 
    } 
} 

echo DebugTest::testFunc("foo", "bar"); 

La ejecución de este programa, se obtiene este resultado:

This trace function was called by testFunc (/Users/mike/debug.php:23) with 2 arguments: foo, bar 

debug_backtrace() devuelve una matriz; El elemento 0 es la función en la que se llamó a la función, por lo que usamos el elemento 1 en el ejemplo. Puede usar un ciclo para recorrer todo el camino de regreso hacia arriba.

0

Más o menos, pero no de una manera que sería aconsejable usar en el código de producción.

En ambos ejemplos se ahorra tener que tener un argumento adicional.

Sería hacer que su código muy difícil de entender, como lo haría romper la encapsulación implicado que tiene una función.

Dicho todo esto, ¿podría usar una variable global para esto?

Cuestiones relacionadas