2010-06-04 3 views
7

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

P.S. Я нахожусь в Vista и не имею доступа к серверу ssh, поэтому «grep» не может быть и речи.Найти, где переменная определена в PHP (И/или SMARTY)?

+1

+1 за неудобство Smarty. Хотя я сам их не использую, я думаю, что php-debugger и xdebug могут как возвращать переменные/содержимое во внешние области, так и все существующие переменные. Во всяком случае, я зажег свечу сострадания к вашей Vista и ситуации отладки. – mario

ответ

5

Это то, что я делаю # 1, устанавливаю Cygwin на все мои машины для окон.

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

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

+3

Попробуйте ack, это лучше, чем grep. Нет, действительно: http://betterthangrep.com/ – Charles

+1

Святые курят, что выглядит потрясающе. Установка теперь из CPAN во всем мире. – Nathan

+0

Эй, я использую АК в течение пары недель, и мне это нравится. Еще раз спасибо, Чарльз! – Nathan

2

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

1

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

2

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

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

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

+0

Eclipse и PHPStorm имеют схожие функции. – DanMan

7

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

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

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

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

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 

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

+0

Спасибо, это отличная идея - я определенно сохраняю этот код для будущей отладки, но в итоге я просто использовал grep, как показано ниже. – Jon

1

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

Если вы хотели бы знать, где 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 раньше, но вы его найдете.

+0

Надеюсь, что это поможет, и как бы уродливо это не было :-): :) –

+0

, если это так ... он заслуживает аванса upvote :) .. –

Смежные вопросы