Найти, где переменная определена в PHP (И / или SMARTY)?

В настоящее время я работаю над очень крупным проектом, и я испытываю сильное давление, чтобы закончить его в ближайшее время, и у меня возникла серьезная проблема. Программист, который написал эти последние определенные переменные очень странным образом: переменные конфигурации не все находятся в одном файле, они распространяются по всему проекту из более чем 500 файлов и 100k + строк кода, и я имею черт возьми, выясняя, где определенная переменная, поэтому я могу исправить проблему.
Есть ли способ отслеживать эту переменную? Я считаю, что он использует SMARTY (чего я не могу вынести из-за таких проблем), а переменная является переменной шаблона. Я уверен, что переменная, которую я ищу, первоначально была определена как переменная PHP, затем эта переменная передается в SMARTY, поэтому я хотел бы отследить PHP-версию, но если это невозможно – как я могу отслеживать вниз, где он определил переменную для SMARTY?

PS Я нахожусь в Vista, и у меня нет доступа к серверу, поэтому «grep» не может быть и речи.

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

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

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

Метод грубой силы, потому что иногда гибкие переменные напрямую не назначаются, но их имена могут храниться в переменных, объединенных из многих строк или являющихся результатом некоторых функций, что делает невозможным поиск в файлах путем простого поиска / 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 

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

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

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

Или ctrl + click по переменной.

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

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

Есть интересный дополнительный вариант, уродливый, как ад, но полезный, если вы действительно потеряны.

Если вы хотите узнать, где был определен THE_NAME , напишите строки, подобные этим, в том месте, где вы уверены, запускается первым:

 error_reporting(E_ALL); define('THE_NAME', 'Chuck Norris'); 

Если позже PHP запустит определение, которое вы ищете, он напишет такое уведомление:

 Notice: Constant THE_NAME already defined in /home/there/can-rip-a-page-out-of-facebook.com/SomeConfiguration.php on line 89 

Тогда вы знаете, что определение, которое вы ищете, находится в файле SomeConfiguration.php в строке 89.

Чтобы это работало, вы должны рассмотреть

  • если в каркасе есть HTTP-форварды на пути к коду, установленному в
  • если есть дополнительные команды, устанавливающие режим сообщений об ошибках PHP

Поэтому иногда это помогает добавить некоторый exit('here') чтобы не размывать вывод. Возможно, вам нужно немного сузить или вам нужно установить error_reporting раньше, но вы его найдете.