¿Cómo obtengo el nombre de la función dentro de una función en PHP?

235

¿Es posible?

function test()
{
  echo "function name is test";
}
Dios mio
fuente
1
Solo por curiosidad, ¿cuándo hay una necesidad de esto? ¿Es posible crear funciones de las que no sabes el nombre?
DisgruntledGoat
37
Un posible uso sería registrar su ejecución. Si está escribiendo "Tuve un error en". FUNCIÓN a un archivo de registro o algo así. De esta manera, si se cambia el nombre de la función, no tiene que preocuparse de que la persona recuerde cambiar el mensaje de registro.
Brian Ramsay
1
¡Lo necesitaba para iniciar sesión! gracias por preguntar :)
SublymeRick
2
También es útil si desea usar el nombre de la función dentro de la función (para otro uso). Le gustaría construir enlaces basados ​​en la función, etc. (por ejemplo: function name1()luego use name1 nuevamente dentro), le ahorraría mucho tiempo si tiene la misma plantilla para muchas funciones.
Mafia
1
@DisgruntledGoat: es útil si crea funciones manualmente y no desea editar el mensaje de error para cada función. Agregarlo al mensaje de error significa que tiene menos trabajo.
John Boe

Respuestas:

390

La forma precisa es utilizar la __FUNCTION__ constante mágica predefinida .

Ejemplo:

class Test {
    function MethodA(){
        echo __FUNCTION__;
    }
}

Resultado: MethodA.

Silfverstrom
fuente
66
FUNCIÓN también funciona para funciones que no son de clase. Probado en PHP 7.0.8.
mvsagar
De la misma manera, ¿cómo obtener el nombre de la clase?
Kiran Reddy
2
@KiranReddy Hay una constante mágica para eso también: __CLASS__. O puedes hacer get_class($this).
Sean the Bean
1
Probado en PHP> = 4
Nabi KAZ
98

Puede usar las constantes mágicas __METHOD__ (incluye el nombre de la clase) o __FUNCTION__(solo el nombre de la función) dependiendo de si es un método o una función ... =)

PatrikAkerstrand
fuente
42
MÉTODO incluye el nombre de la clase, FUNCIÓN es solo eso. Este último está igualmente disponible en el método de una clase.
Alister Bulman
3
Es verdad. Pero a menudo es útil obtener MyClass :: methodName en lugar de methodName.
PatrikAkerstrand
16

Si está utilizando PHP 5, puede probar esto:

function a() {
    $trace = debug_backtrace();
    echo $trace[0]["function"];
}
Kevin Newman
fuente
14
Esto es increíblemente intensivo en recursos. Usar FUNCTION o METHOD es mucho más eficiente. sin embargo, debug_backtrace () es excelente si necesita algo más que el nombre de la función.
Luke Cousins ​​el
2
Es una mala práctica usar debug_backtrace () para este propósito
Marcio Mazzucato
1
Esta es la única forma correcta que he encontrado !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!! porque __FUNCTION__devuelve el nombre de la función principal (cuando la función actual se incluye en la función principal)
T.Todua
55
@tazo todua. ¿Puede dar un ejemplo?
alds
2
<?php

  class Test {
     function MethodA(){
         echo __FUNCTION__ ;
     }
 }
 $test = new Test;
 echo $test->MethodA();
?>

Resultado: "Método A";

Snehal K
fuente
Si bien este fragmento de código puede ser la solución, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer los motivos de su sugerencia de código.
SilverNak