Jak dowiedzieć się, gdzie zdefiniowano funkcję?

109

Jak mogę się dowiedzieć, w którym pliku i linii została zdefiniowana dana funkcja?

Słone jezioro
źródło

Odpowiedzi:

231

Możesz to również zrobić w samym PHP:

$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();
Tom Haigh
źródło
8
Wskazówka: $reflFunc->isInternal() === TRUEoznacza -> getFileName () i -> getStartLine () zwróci FALSE.
Bob Stein,
To nadal działa dobrze dla mnie. Chciałbym wskazać miejsce, w którym funkcja jest uruchamiana, a nie miejsce, w którym jest definiowana.
EHerman
2
@EHerman Myślę, że nie można znaleźć wywołań funkcji z odbiciem. Gdybyś mógł, prawdopodobnie nie działałby dobrze, ponieważ pliki PHP są zwykle dołączane na żądanie, więc prawdopodobnie nie załadowałbyś całego kodu, który wywołuje funkcję.
Tom Haigh
11
W przypadku metod klasowych możesz użyć$reflFunc = new ReflectionMethod($this, 'method_name');
Ladislav Gallay
3
@EHerman, możesz zajrzeć do debug_backtrace (), aby znaleźć miejsce wywołania funkcji.
dotVezz,
12

Albo użyj IDE, które na to pozwala (polecałbym Eclipse PDT), albo zawsze możesz go grepować, jeśli używasz Linuksa, lub używając wingrep. W Linuksie byłoby to coś takiego:

grep -R "function funName" *

z folderu głównego projektu.

Johnco
źródło
5
lepiej mieć: grep -R "function \ sfunName" *
David
3

Jeśli używasz IDE, takiego jak Netbeans, możesz CTRL + kliknąć funkcję, która przeniesie Cię do miejsca, w którym została zdefiniowana, zakładając, że plik znajduje się w zdefiniowanym folderze projektu.

Nie ma jednak kodu ani funkcji, która mogłaby to zrobić.

Stephen Melrose
źródło
To samo w Zend Studio i zakładam, że to zadziała również wtedy z PDT dla Eclipse.
Gordon
@Gordon "IDE jak" Myślę, że jest to
pozycja
2

Zakładam, że przez „opisany” masz na myśli „zdefiniowany”. W tym celu idealnie potrzebujesz przyzwoitego środowiska IDE, które może to zrobić.

Anton Gogolev
źródło
Używam Aptany, które mają przeszukiwanie tekstu w projekcie. Ale aby go użyć, muszę zaimportować witrynę z otworami (bardzo dużą) jako projekt.
SaltLake
2

Oto podstawowa funkcja, która skanuje całe pliki projektu w poszukiwaniu określonego ciągu i informuje, w którym pliku się znajduje i od której pozycji znaku zaczyna się, używając tylko podstawowego php. Mam nadzieję, że to komuś pomoże ...

<?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
źródło
2

inny sposób sprawdzenia, gdzie jest zdefiniowana funkcja, spróbuj przedefiniować funkcję, system błędów PHP po prostu zwróci błąd informujący o miejscu wcześniej zdefiniowanej funkcji

Yohanip
źródło
1

Podoba mi się rozwiązanie Toma, więc pomyślałem, że mógłbym podzielić się nieco więcej trikami z ReflectionFunction (powinno działać na każdym PHP 5):

  • jednowierszowy do wydrukowania nazwy pliku:

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

Należy pamiętać, że nie pokaże on lokalizacji funkcji wewnętrznych (takich jak _ ), ale nadal może wydrukować dla niego interfejs API, jak poniżej.

  • wydrukować definicję i parametry funkcji:

    print new ReflectionFunction("foo");

    Przykład:

    $ php -r 'print new ReflectionFunction("_");'
    Function [ <internal:gettext> function _ ] {
      - Parameters [1] {
        Parameter #0 [ <required> $msgid ]
      }
    }
kenorb
źródło
0

Będziesz potrzebować IDE obsługującego funkcję „Open Function Declaration”. Dobrym rozwiązaniem dla php jest Eclipse PDT.

Aby poszukać definicji funkcji, podświetl nazwę funkcji, przytrzymaj CTRL + kliknij nazwę.

Yada
źródło