Найдите, где переменная определяется в PHP (И/или ПРИСЯЖНЫЙ ОСТРОСЛОВ)?

Я в настоящее время работаю над очень крупным проектом и нахожусь под большим давлением для окончания его скоро, и у меня есть серьезная проблема. Программист, который записал этому в последний раз определенные переменные очень нечетным способом - переменные конфигурации, не является всеми в том же файле, они распространены через весь проект более чем 500 файлов и 100k + строки кода, и у меня есть адское время, выясняя, где определенная переменная, таким образом, я могу устранить проблему.
Существует ли способ разыскать эту переменную? Я полагаю, что он использует ПРИСЯЖНОГО ОСТРОСЛОВА (Который я не могу стоять, из-за проблем как это), и переменная является переменной шаблона. Я абсолютно уверен, что переменная, которую я ищу, была первоначально определена как переменная PHP, затем та переменная передается в ПРИСЯЖНОГО ОСТРОСЛОВА, таким образом, я хотел бы разыскать PHP один, однако если это невозможно - как я могу разыскать, где он определил переменную для ПРИСЯЖНОГО ОСТРОСЛОВА?

P.S. Я нахожусь в Vista и не имею ssh доступа к серверу, таким образом, 'grep' вне рассмотрения.

9
задан Jon 4 June 2010 в 00:47
поделиться

5 ответов

Подобные вещи - причина №1, по которой я устанавливаю Cygwin на всех своих машинах с Windows.

grep myvariablename `find project_dir -name "*.php"`

Я не могу представить себе программирование без работающего grep .

8
ответ дан 4 December 2019 в 08:14
поделиться

Если вы используете редактор netbeans , просто «щелкните правой кнопкой мыши» -> «перейти к определению»

или ctrl + щелкните по переменной.

Если редактор не может понять это, вы можете вернуться к опции «Найти в файлах».

2
ответ дан 4 December 2019 в 08:14
поделиться

Способ грубой силы, потому что иногда переменные smarty не назначаются напрямую, а их имена могут храниться в переменных, конкатенироваться из многих строк или быть результатом работы некоторых функций, что делает невозможным их поиск в файлах простым поиском / greping.

Во-первых, напишите собственную функцию для вывода читаемого бэктрейса, т.е.:

function print_backtrace()
{
    $backtrace = debug_backtrace(FALSE);
    foreach($backtrace as $trace)
        echo "{$trace['file']} :: {$trace['line']}<br>";
}

Откройте основной файл smarty (Smarty.class.php по умолчанию) и около строки 580 есть функция assign. Измените ее так, чтобы она следила за именем нужной переменной:

function assign($tpl_var, $value = null)
{
    if($tpl_var == 'FOOBAR') /* Searching for FOOBAR */
    {
        print_backtrace();
        exit;
    }

Такая же модификация может потребоваться и для второй функции - assign_by_ref. Теперь после выполнения скрипта у вас должен получиться такой вывод:

D:\www\test_proj\libs\smarty\Smarty.class.php :: 584
D:\www\test_proj\classes.php :: 11
D:\www\test_proj\classes.php :: 6
D:\www\test_proj\functions.php :: 7
D:\www\test_proj\index.php :: 100

Вторая строка указывает на место, где переменная была впервые назначена.

9
ответ дан 4 December 2019 в 08:14
поделиться

Просто используйте одну из доступных PHP IDE (или простой текстовый редактор, например Notepad ++, если вы действительно в отчаянии) и найдите имя переменной во всех исходных файлах (большинство PHP IDE также поддержка поиска, где были определены функции / переменные, и позволяет вам перейти к соответствующему фрагменту кода). Хотя кажется странным, что вы не знаете, какой фрагмент кода вызывает шаблон (будь то Smarty или что-то еще, на самом деле не имеет значения). Вы должны иметь возможность детализировать код, начиная с URI (используя любую IDE, которая поддерживает отладку), потому что таким образом вы обязательно увидите, где определена указанная переменная.

1
ответ дан 4 December 2019 в 08:14
поделиться

Это не идеальное решение, но я нахожу agent ransack полезным для поиска в больших каталогах и файлах. Это может помочь вам сузить круг поиска. Результаты поиска позволят вам прочитать точную строку, в которой найдено совпадение, в панели результатов.

2
ответ дан 4 December 2019 в 08:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: