Jak mogę się dowiedzieć, w którym pliku i linii została zdefiniowana dana funkcja?
Jak mogę się dowiedzieć, w którym pliku i linii została zdefiniowana dana funkcja?
Odpowiedzi:
Możesz to również zrobić w samym PHP:
$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();
$reflFunc = new ReflectionMethod($this, 'method_name');
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.
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ć.
Zakładam, że przez „opisany” masz na myśli „zdefiniowany”. W tym celu idealnie potrzebujesz przyzwoitego środowiska IDE, które może to zrobić.
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;
}
?>
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 ]
}
}
$reflFunc->isInternal() === TRUE
oznacza -> getFileName () i -> getStartLine () zwróci FALSE.