¿Cómo saber dónde se define una función?

109

¿Cómo puedo saber en qué archivo y línea se definió una función determinada?

Lago salado
fuente

Respuestas:

231

También puede hacer esto en PHP mismo:

$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();
Tom Haigh
fuente
8
Consejo: $reflFunc->isInternal() === TRUEsignifica que -> getFileName () y -> getStartLine () devolverán FALSE.
Bob Stein
Esto todavía me funciona bien. Me gustaría apuntar a dónde se dispara la función, en lugar de desde dónde se define.
EHerman
2
@EHerman No creo que puedas encontrar personas que llaman a una función con reflejo. Si pudiera, probablemente no funcionaría bien para esto porque los archivos PHP tienden a incluirse bajo demanda, por lo que es probable que no tenga todo el código cargado que llama a la función.
Tom Haigh
11
Para los métodos de clase que puede utilizar$reflFunc = new ReflectionMethod($this, 'method_name');
Ladislav Gallay
3
@EHerman, podría buscar en debug_backtrace () para encontrar dónde se está llamando a una función.
dotVezz
12

O use un IDE que permita hacerlo (recomendaría Eclipse PDT), o siempre puede grep si está en Linux, o usando wingrep. En Linux sería algo como:

grep -R "function funName" *

desde la carpeta raíz del proyecto.

Johnco
fuente
5
mejor tener: grep -R "function \ sfunName" *
David
3

Si usa un IDE como Netbeans, puede CTRL + clic en el uso de la función y lo llevará a donde está definido, asumiendo que el archivo está dentro de la carpeta del proyecto que definió.

Sin embargo, no hay ningún código o función para hacer esto.

Stephen Melrose
fuente
Lo mismo en Zend Studio y supongo que esto también funcionará con PDT para Eclipse.
Gordon
@Gordon "como un IDE" Creo que esto es una necesidad para cualquier IDE moderno ...
feeela
2

Supongo que por "descrito" te refieres a "definido". Para esto, idealmente necesita un IDE decente que pueda hacerlo.

Anton Gogolev
fuente
Estoy usando Aptana que tiene búsqueda de texto a través del proyecto. Pero para usarlo, necesito importar el sitio del agujero (muy grande) como un proyecto.
SaltLake
2

Aquí hay una función básica que escaneará todos los archivos de su proyecto en busca de una cadena específica y le dirá en qué archivo se encuentra y en qué posición de caracteres comienza usando solo php básico. Espero que esto ayude a alguien...

<?php 
$find="somefunction()";

echo findString('./ProjectFolderOrPath/',$find);

function findString($path,$find){
    $return='';
    ob_start();
    if ($handle = opendir($path)) {
        while (false !== ($file = readdir($handle))) {
            if ($file != "." && $file != "..") {
                if(is_dir($path.'/'.$file)){
                    $sub=findString($path.'/'.$file,$find);
                    if(isset($sub)){
                        echo $sub.PHP_EOL;
                    }
                }else{
                    $ext=substr(strtolower($file),-3);
                    if($ext=='php'){
                        $filesource=file_get_contents($path.'/'.$file);
                        $pos = strpos($filesource, $find);
                        if ($pos === false) {
                            continue;
                        } else {
                            echo "The string '$find' was found in the file '$path/$file and exists at position $pos<br />";
                        }
                    }else{
                        continue;
                    }
                }
            }
        }
        closedir($handle);
    }
    $return = ob_get_contents();
    ob_end_clean();
    return $return;
}
?>
Lawrence Cherone
fuente
2

otra forma de verificar dónde está definida la función, intente redefinir la función, el sistema de errores de PHP simplemente devolverá un error que le indica dónde está la función definida previamente

Yohanip
fuente
1

Me gusta la solución de Tom, así que pensé que podría compartir un poco más de trucos con ReflectionFunction (debería funcionar en todos los PHP 5):

  • una sola línea para imprimir el nombre del archivo:

    print (new ReflectionFunction("foo"))->getFileName();

Tenga en cuenta que no le mostrará la ubicación de las funciones internas (como _ ), pero aún puede imprimir la API como se muestra a continuación.

  • para imprimir la definición y los parámetros de la función:

    print new ReflectionFunction("foo");

    Ejemplo:

    $ php -r 'print new ReflectionFunction("_");'
    Function [ <internal:gettext> function _ ] {
      - Parameters [1] {
        Parameter #0 [ <required> $msgid ]
      }
    }
Kenorb
fuente
0

Necesitará un IDE que admita la funcionalidad de "Declaración de función abierta". Una buena opción para php es Eclipse PDT.

Para buscar la definición de la función, resalte el nombre de la función, mantenga presionada la tecla CTRL + Clic en el nombre.

Yada
fuente