Как узнать, где определена функция?

110

Как я могу узнать, в каком файле и строке была определена данная функция?

Соленое озеро
источник

Ответы:

232

Вы также можете сделать это в самом PHP:

$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();
Том Хей
источник
8
Совет: $reflFunc->isInternal() === TRUEзначит -> getFileName () и -> getStartLine () вернет FALSE.
Bob Stein
Это все еще хорошо работает для меня. Я хотел бы указать, где функция запускается, а не откуда она определяется.
EHerman
2
@EHerman Я не думаю, что вы можете найти вызывающих функцию с отражением. Если бы вы могли, это, вероятно, не сработало бы для этого, потому что файлы PHP, как правило, включаются по запросу, и поэтому у вас, вероятно, не будет загружен весь код, который вызывает функцию.
Том Хей
11
Для методов класса вы можете использовать$reflFunc = new ReflectionMethod($this, 'method_name');
Ладислав Галлай
3
@EHerman вы можете заглянуть в debug_backtrace (), чтобы узнать, где вызывается функция.
dotVezz 05
12

Либо используйте IDE, которая позволяет это сделать (я бы порекомендовал Eclipse PDT), либо вы всегда можете использовать grep, если в Linux, либо с помощью wingrep. В Linux это будет примерно так:

grep -R "function funName" *

из корневой папки проекта.

Джонко
источник
5
Лучше иметь: grep -R "function \ sfunName" *
Дэвид
3

Если вы используете IDE, например Netbeans, вы можете CTRL + щелкнуть по использованию функции, и она перенесет вас туда, где она определена, при условии, что файл находится в папке проекта, которую вы определили.

Однако для этого нет кода или функции.

Стивен Мелроуз
источник
То же самое в Zend Studio, и я предполагаю, что тогда это будет работать и с PDT для Eclipse.
Гордон
@Gordon, «подобная IDE», я думаю, это просто необходимо для любой современной IDE…
Feela
2

Я предполагаю, что под «описанным» вы имеете в виду «определенное». Для этого в идеале вам понадобится достойная среда IDE, которая сможет это сделать.

Антон Гоголев
источник
Я использую Aptana с текстовым поиском по проекту. Но чтобы его использовать, мне нужно импортировать дыру (очень большую) в качестве проекта.
SaltLake
2

Это базовая функция, которая будет сканировать все ваши файлы проекта на предмет определенной строки и сообщать вам, в каком файле он находится и с какой позиции символа он начинается, используя только базовый 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;
}
?>
Лоуренс Чероне
источник
2

другой способ проверить, где определена функция, попробуйте переопределить функцию, система ошибок PHP просто вернет ошибку, сообщающую вам, где функция была ранее определена

Yohanip
источник
1

Мне нравится решение Тома, поэтому я подумал, что могу поделиться еще немного трюками с ReflectionFunction (он должен работать на каждом PHP 5):

  • однострочный для печати имени файла:

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

Обратите внимание, что он не покажет вам расположение внутренних функций (таких как _ ), но он все равно может распечатать API для него, как показано ниже.

  • чтобы распечатать определение и параметры функции:

    print new ReflectionFunction("foo");

    Пример:

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

Вам понадобится IDE, поддерживающая функциональность «Объявление открытой функции». Подходит для php Eclipse PDT.

Чтобы найти определение функции, выделите имя функции, удерживайте CTRL + щелкните имя.

Яда
источник