Як дізнатися, де визначена функція?


109

Як я можу дізнатися, у якому файлі та рядку була визначена дана функція?

Відповіді:


231

Ви також можете це зробити в самому PHP:

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

8
Порада: $reflFunc->isInternal() === TRUEозначає -> getFileName () і -> getStartLine () поверне FALSE.
Боб Штейн

Це все ще добре працює для мене. Я хотів би націлити місце, де функція запускається, а не де вона визначається.
EHerman

2
@EHerman Я не думаю, що ви можете знайти абонентів функції з відображенням. Якби ви могли, це, ймовірно, не спрацювало б для цього, оскільки файли PHP, як правило, включаються на вимогу, і тому ви, ймовірно, не будете завантажені весь код, який викликає функцію.
Том Хей

11
Для методів класу ви можете використовувати$reflFunc = new ReflectionMethod($this, 'method_name');
Ladislav Gallay

3
@EHerman, ви можете заглянути в debug_backtrace (), щоб знайти місце виклику функції.
dotVezz

12

Або використовуйте IDE, який дозволяє це робити (я б рекомендував Eclipse PDT), або ви завжди можете його схрестити, якщо в Linux, або використовуючи wingrep. У Linux це було б щось на кшталт:

grep -R "function funName" *

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


5
краще мати: grep -R "функція \ sfunName" *
Девід

3

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

Немає жодного коду чи функції, щоб це зробити.


Те саме в Zend Studio, і я припускаю, що це буде працювати і з PDT для Eclipse.
Гордон

@Gordon "подібний IDE" Я думаю, що це обов'язково для будь-якого сучасного IDE ...
honoela

2

Я припускаю, що під "описаним" ви маєте на увазі "визначений". Для цього вам ідеально потрібна гідна IDE, яка може це зробити.


Я використовую Aptana, які шукають текст за допомогою проекту. Але для його використання мені потрібно імпортувати дірку (дуже великий) сайт як проект.
SaltLake

2

Ось основна функція, яка скануватиме всі ваші файли проекту на певний рядок і скаже вам, у якому файлі він знаходиться і в якому положенні char запускається, використовуючи лише базовий 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 просто поверне помилку, сказану вам, де функція була визначена раніше


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 ]
      }
    }

0

Вам знадобиться IDE, який підтримує функцію "Відкрити функцію декларації". Хорошим для php є Eclipse PDT.

Щоб шукати визначення функції, виділіть ім'я функції, утримуйте CTRL + Клацніть на ім'я.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.