Найти, где переменная определена в PHP (и / или SMARTY)? - PullRequest
8 голосов
/ 04 июня 2010

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

Ответы [ 6 ]

9 голосов
/ 05 июня 2010

Способ грубой силы, потому что иногда 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

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

8 голосов
/ 04 июня 2010

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

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

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

4 голосов
/ 26 января 2017

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

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

2 голосов
/ 05 июня 2010

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

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

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

2 голосов
/ 04 июня 2010

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

1 голос
/ 04 июня 2010

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

...