如何找出定义函数的位置?

如何找出在哪个文件和行中定义了一个给定的函数?

52113 次浏览

我假设你所说的“描述”是指“定义”,为此,理想情况下,你需要一个可以做到这一点的像样的 IDE。

如果您使用像 Netbeans 这样的 IDE,您可以使用 CTRL + C 单击函数 use,它将带您到定义函数的位置,假设该文件位于您定义的项目文件夹中。

但是没有代码或函数可以这样做。

要么使用允许这样做的 IDE (我建议使用 Eclipse PDT) ,要么在 Linux 上使用 grep,或者使用 wingrep。在 Linux 中,它可能是这样的:

grep -R "function funName" *

从项目的根文件夹中。

You'll need an IDE that supports "Open Function Declaration" functionality. A good for for php is Eclipse PDT.

要查找函数定义,请突出显示函数名称,按住 CTRL + Click 按住该名称。

您也可以在 PHP 本身中这样做:

$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();

下面是一个基本函数,它将扫描 整个项目文件中的特定字符串,并告诉您它在哪个文件中,以及它从哪个字符位置开始,只使用基本的 php。 希望这能帮到别人。

<?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;
}
?>

我喜欢 Tom 的解决方案,所以我想我可以和 反射函数分享一些更多的技巧(它应该适用于每个 PHP5) :

  • 打印文件名的一行程序:

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

Please note that it won't show you the location for internal functions (such as _), but it still can print the API for it as below.

  • to print the definition and parameters of the function:

    print new ReflectionFunction("foo");
    

    例如:

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

another way to check where does the function defined, try to redefine the function, PHP error system will simply returns an error told you where the function previously defined