Como descobrir onde uma função é definida?

109

Como posso saber em qual arquivo e linha uma determinada função foi definida?

Lago salgado
fonte

Respostas:

231

Você também pode fazer isso no próprio PHP:

$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();
Tom Haigh
fonte
8
Dica: $reflFunc->isInternal() === TRUEsignifica -> getFileName () e -> getStartLine () retornará FALSE.
Bob Stein
Isso ainda funciona bem para mim. Eu gostaria de direcionar onde a função está sendo disparada, em vez de onde ela está sendo definida.
EHerman
2
@EHerman Não acho que você possa encontrar chamadores de uma função com reflexão. Se pudesse, provavelmente não funcionaria bem para isso, porque os arquivos PHP tendem a ser incluídos sob demanda e, portanto, você provavelmente não carregaria todo o código que chama a função.
Tom Haigh
11
Para métodos de classe que você pode usar$reflFunc = new ReflectionMethod($this, 'method_name');
Ladislav Gallay
3
@EHerman você pode olhar em debug_backtrace () para encontrar onde uma função está sendo chamada.
dotVezz
12

Use um IDE que permita isso (eu recomendo o Eclipse PDT), ou você pode sempre fazer o grep se estiver no Linux, ou usando o wingrep. No Linux, seria algo como:

grep -R "function funName" *

de dentro da pasta raiz do projeto.

Johnco
fonte
5
melhor ter: grep -R "function \ sfunName" *
David
3

Se você usar um IDE como o Netbeans, poderá CTRL + Clique na função usar e ela o levará para onde está definida, assumindo que o arquivo está dentro da pasta do projeto que você definiu.

No entanto, não há código ou função para fazer isso.

Stephen Melrose
fonte
O mesmo ocorre no Zend Studio e presumo que funcionará com o PDT para Eclipse também.
Gordon
@Gordon "um IDE como" Eu acho que isso é obrigatório para qualquer IDE moderno…
feeela
2

Presumo que por "descrito" você quer dizer "definido". Para isso, você precisa idealmente de um IDE decente que possa fazer isso.

Anton Gogolev
fonte
Estou usando o Aptana que tem pesquisa de texto por meio do projeto. Mas para usá-lo, preciso importar o site (muito grande) do furo como um projeto.
SaltLake
2

Aqui está uma função básica que irá escanear seus arquivos de projeto inteiros para uma string específica e dizer a você em qual arquivo ele está e em qual posição de caractere ele começa usando apenas php básico. Espero que isso ajude alguém ...

<?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
fonte
2

outra forma de verificar onde está a função definida, tente redefinir a função, o sistema de erro do PHP simplesmente retornará um erro informando onde está a função definida anteriormente

Yohanip
fonte
1

Gosto da solução de Tom, então pensei que poderia compartilhar um pouco mais de truques com ReflectionFunction (ele deve funcionar em todos os PHP 5):

  • one-liner para imprimir o nome do arquivo:

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

Observe que ele não mostrará a localização das funções internas (como _ ), mas ainda pode imprimir a API para ele conforme abaixo.

  • para imprimir a definição e os parâmetros da função:

    print new ReflectionFunction("foo");

    Exemplo:

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

Você precisará de um IDE que ofereça suporte à funcionalidade "Declaração de função aberta". Um bom para php é Eclipse PDT.

Para procurar a definição da função, realce o nome da função, segure CTRL + Clique no nome.

Yada
fonte