Foros del Web » Programando para Internet » PHP »

Saber qué función llama a otra

Estas en el tema de Saber qué función llama a otra en el foro de PHP en Foros del Web. Hola foreros, quisiera saber si hay alguna forma de saber el nombre de la función que está llamando a otra dentro de una clase, ejemplo: ...
  #1 (permalink)  
Antiguo 15/07/2011, 11:13
de-troit
Invitado
 
Mensajes: n/a
Puntos:
Saber qué función llama a otra

Hola foreros, quisiera saber si hay alguna forma de saber el nombre de la función que está llamando a otra dentro de una clase, ejemplo:

Código PHP:
class myClass {
    public function 
func() { return [aquí el nombre de la función que llama]; }
    public static function 
caller() { echo self::func(); }
}

myClass::caller();

#SALIDA: caller 
Hay alguna forma de saber esto?
Saludos!

Última edición por de-troit; 15/07/2011 a las 11:23
  #2 (permalink)  
Antiguo 15/07/2011, 11:35
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Saber qué función llama a otra

Trata con __get y __set.

Edito: Se me olvidaba mejor trata con __call
Código PHP:
Ver original
  1. <?php
  2. class Foo
  3. {
  4.     public function __call($name, $arguments)
  5.     {
  6.         return array($name, $arguments);
  7.     }
  8. }
  9. $foo = new Foo;
  10. print_r($foo->bar('baz', 'candy'));
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 15/07/2011 a las 11:42
  #3 (permalink)  
Antiguo 15/07/2011, 11:39
de-troit
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Saber qué función llama a otra

Descubrí esta forma, pero la verdad creo que la función debug_backtrace ocupa muchos recursos obteniendo otra información además de la función desde la que fué llamada la función en cuestión. La verdad es que me gustaría obtener de forma inmediata la función desde la que es llamada, algo así como un calledBy();

Existe tal forma? O alguna solución mejor a la que tengo?
Saludos!

Código PHP:
class myClass {
    public function 
func() {
        
$debug debug_backtrace();
        return 
$debug[1]['function'];
    }
    
    public static function 
caller() { echo self::func(); }
    public static function 
caller2() { echo self::func(); }
}
    
myClass::caller();
myClass::caller2(); 
  #4 (permalink)  
Antiguo 15/07/2011, 11:40
de-troit
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Saber qué función llama a otra

Cita:
Iniciado por abimaelrc Ver Mensaje
Trata usando __get y __set
No entiendo a qué te refieres. De qué forma debo usar eso?
Disculpa por no saber. Gracias.
  #5 (permalink)  
Antiguo 15/07/2011, 11:43
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Saber qué función llama a otra

Hice una edición.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #6 (permalink)  
Antiguo 15/07/2011, 11:43
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Saber qué función llama a otra

De hecho yo considero que es mejor con debug_backtrace().
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 15/07/2011, 11:45
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Saber qué función llama a otra

Cita:
Iniciado por pateketrueke Ver Mensaje
De hecho yo considero que es mejor con debug_backtrace().
Bueno si es para debuguear sí, pero para llamar un método porque quiere hacer algo antes de cada método creo que lo mejor es usar los métodos mágicos. Digo si es para debuguear lo mejor es lo que tu dices
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #8 (permalink)  
Antiguo 15/07/2011, 11:51
de-troit
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Saber qué función llama a otra

Cita:
Iniciado por abimaelrc Ver Mensaje
Hice una edición.
No entiendo el propósito de la función que creaste. Eso retorna el nombre de la función que llama a la función en cuestión? Me podrías dar una breve explicación?
Muchas gracias :)
  #9 (permalink)  
Antiguo 15/07/2011, 11:52
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Saber qué función llama a otra

¿Pero no acabas de indicar que quieres que te diga la función que estás llamando? Ya me perdí con lo que quieres hacer
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #10 (permalink)  
Antiguo 15/07/2011, 11:54
de-troit
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Saber qué función llama a otra

Cita:
Iniciado por abimaelrc Ver Mensaje
Bueno si es para debuguear sí, pero para llamar un método porque quiere hacer algo antes de cada método creo que lo mejor es usar los métodos mágicos. Digo si es para debuguear lo mejor es lo que tu dices
No es para debuguear, lo que pasa es que hice una clase que facilita el uso de base de datos, en donde a través de un array estático se pueden asignar distintos mensajes para los errores, se puede asignar un mensaje para cada método. Cada uno de estos métodos llama a la función "query" donde se gestionan los errores, entonces por eso necesito saber qué función llama a query para mostrar el mensaje de error correspondiente a la situación. Me explico?

Muchas gracias ;)
  #11 (permalink)  
Antiguo 15/07/2011, 11:56
de-troit
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Saber qué función llama a otra

Cita:
Iniciado por abimaelrc Ver Mensaje
¿Pero no acabas de indicar que quieres que te diga la función que estás llamando? Ya me perdí con lo que quieres hacer
Quiero saber el nombre de la función que está llamando a la función que me importa, ejemplo si la función llamador llama a método, quiero que dentro de la función método pueda saber que la función que la llamó es llamador. Eso es.
  #12 (permalink)  
Antiguo 15/07/2011, 12:07
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Saber qué función llama a otra

Que tal de-troit,

Porque no pasas directamente por parámetro el nombre de la función ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #13 (permalink)  
Antiguo 15/07/2011, 12:13
de-troit
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Saber qué función llama a otra

Cita:
Iniciado por masterpuppet Ver Mensaje
Que tal de-troit,

Porque no pasas directamente por parámetro el nombre de la función ?
Lo que pasa es que el número de parámetros no es exacto siempre, derrepente una función puede recibir parámetros o no, en otros casos 1 o más.

La solución que tengo por ahora, es que como la clase para su uso debe ser instanciada, asigno al objeto en cuestión (this) el nombre de la función que está llamando ahora y la obtengo en la otra función.

Pero me gustaría saber si hay alguna forma de obtenerla directamente sin asignarlo al objeto una y otra vez.

Saludos!
  #14 (permalink)  
Antiguo 15/07/2011, 12:51
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Saber qué función llama a otra

Entonces yo no veo mal el uso de debug_backtrace(), digo, si contiene la información de la traza de ejecución pues a usarla!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #15 (permalink)  
Antiguo 15/07/2011, 13:30
de-troit
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Saber qué función llama a otra

Cita:
Iniciado por pateketrueke Ver Mensaje
Entonces yo no veo mal el uso de debug_backtrace(), digo, si contiene la información de la traza de ejecución pues a usarla!
Me parece buena opción, el problema es que también ofrece mucha más información por lo que mi respuesta demorará más sólo para obtener el nombre de la función, la idea es optimizar. Parece que no hay ninguna otra forma... por lo menos no he pillado nada en internet. Si llegas (llegan) a saber de algo me avisas (avisan) por favor.

Saludos!
  #16 (permalink)  
Antiguo 15/07/2011, 13:43
de-troit
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Saber qué función llama a otra

Al final tengo esto, lo dejo porsi alguien llega a necesitarlo:

Código PHP:
class myClass {
    public function 
func() {
        
$debug debug_backtrace(false);
        return 
$debug[1]['function'];
    }
    
    public static function 
caller() { echo self::func(); }
    public static function 
caller2() { echo self::func(); }
}

myClass::caller();
myClass::caller2();

/* OUTPUT:
   caller
   caller2
*/ 
En donde a debug_backtrace le paso como parámetro para la opción DEBUG_BACKTRACE_PROVIDE_OBJECT un valor booleano falso, para que no me entregue información acerca de esto y así ahorar un poco de memoria y proceso.

Pueden saber más acerca de esta función aquí: http://php.net/manual/en/function.debug-backtrace.php

Sigo abierto a nuevas ideas para optimizar más. Saludos!

Etiquetas: llama
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:39.