2010-06-04 6 views
7

Ich arbeite gerade an einem sehr großen Projekt, und bin unter viel Druck, es bald zu beenden, und ich habe ein ernstes Problem. Der Programmierer, der das zuletzt geschrieben hat, hat Variablen auf eine sehr seltsame Art und Weise definiert - die Konfigurationsvariablen sind nicht alle in der gleichen Datei, sie verteilen sich über das gesamte Projekt von mehr als 500 Dateien und 100.000 Zeilen Code, und das habe ich eine verdammt lange Zeit herauszufinden, wo eine bestimmte Variable ist, damit ich ein Problem beheben kann.
Gibt es eine Möglichkeit, diese Variable nach unten zu verfolgen? Ich glaube, er benutzt SMARTY (was ich wegen solcher Probleme nicht aushalte), und die Variable ist eine Template-Variable. Ich bin mir ziemlich sicher, dass die Variable, nach der ich suche, ursprünglich als PHP-Variable definiert wurde, dann wird diese Variable an SMARTY übergeben, also würde ich gerne die PHP-Version aufspüren. Wenn das aber unmöglich ist - wie kann ich sie verfolgen? nach unten, wo er die Variable für SMARTY definiert?

P.S. Ich bin in Vista und habe keinen SSH-Zugriff auf den Server, daher kommt 'Grep' nicht in Frage.Finden Sie, wo eine Variable in PHP (und/oder SMARTY) definiert ist?

+1

+1 für nicht mögen Smarty. Obwohl ich sie nicht selbst benutze, denke ich, dass php-debugger und xdebug sowohl Variablen/Inhalte in äußeren Bereichen als auch alle existierenden Variablen zurückverfolgen können. Wie auch immer, ich habe eine Kerze des Mitgefühls für Ihre Vista und Debugging-Situation angezündet. – mario

Antwort

5

Diese Art von Sache ist der Grund Nr. 1 Ich installiere Cygwin auf allen meinen Windows-Maschinen.

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

Ich kann mir nicht vorstellen, ohne zu programmieren grep.

+3

Probieren Sie es aus, es ist besser als Grep. Nein, wirklich: http://betterthangrep.com/ – Charles

+1

Heilige raucht das sieht super aus. Installieren Sie jetzt von CPAN überall. – Nathan

+0

Hey, ich benutze jetzt seit ein paar Wochen Ack und ich liebe es. Nochmals vielen Dank, Charles! – Nathan

2

Es ist keine perfekte Lösung, aber ich finde agent ransack nützlich für die Suche in großen Verzeichnissen und Dateien. Könnte dir helfen, Dinge einzugrenzen. Mit den Suchergebnissen können Sie die genaue Zeile, in der eine Übereinstimmung gefunden wird, im Ergebnisbereich lesen.

1

Verwenden Sie einfach eine der verfügbaren PHP-IDEs (oder einen einfachen Texteditor wie Notepad ++, wenn Sie wirklich verzweifelt sind) und suchen Sie nach dem Namen der Variablen in allen Quelldateien (die meisten PHP IDEs unterstützen auch die Suche nach Funktionen/vars wurden definiert und erlauben Ihnen, zu dem entsprechenden Code zu springen). Obwohl es merkwürdig erscheint, dass Sie nicht wissen, welches Stück Code die Vorlage aufruft (ob es Smarty oder irgendetwas anderes ist, spielt keine Rolle). Sie sollten in der Lage sein, den Code ausgehend vom URI (mit jeder IDE, die das Debugging unterstützt) im Code zu untersuchen, da Sie auf diese Weise sehen können, wo die Variable definiert ist.

2

Wenn Sie die netbeans editor verwenden nur "rechte Maustaste" -> "Gehe zu Definition"

Oder ctrl + click auf die Variable.

Wenn der Editor es nicht herausfinden kann, können Sie auf die Option "In Dateien suchen" zurückgreifen.

+0

Eclipse und PHPStorm haben ähnliche Funktionen. – DanMan

7

Brute force Weg, weil manchmal Smarty Variablen nicht direkt zugewiesen werden, aber ihre Namen können in Variablen gespeichert werden, verkettet aus vielen Zeichenfolgen oder Ergebnis einiger Funktionen, die es unmöglich macht, in Dateien durch einfaches Suchen/Greping zu finden .

Zunächst schreiben Sie Ihre eigene Funktion lesbar Backtrace zu drucken, das heißt:

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

öffnen Haupt Smarty-Datei (Smarty.class.php Standardeinstellung) und um die Linie 580 gibt es Funktion zuweisen genannt. Ändern Sie es für die gewünschte Variablennamen zu sehen:

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

Die gleiche Modifikation kann für die zweite Funktion erforderlich - assign_by_ref.Nach dem Ausführen des Skripts sollten Sie nun folgendes Ergebnis erhalten haben:

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 

Die zweite Zeile zeigt auf die Stelle, an der die Variable zuerst zugewiesen wurde.

+0

Danke, das ist eine großartige Idee - ich spare diesen Code definitiv für zukünftiges Debugging, aber ich habe am Ende nur grep benutzt, wie unten vorgeschlagen. – Jon

1

Es gibt eine interessante weitere Option, hässlich wie die Hölle, aber hilfreich, wenn Sie wirklich verloren sind.

Wenn Sie möchten wissen, wo THE_NAME definiert wurde, schreiben Zeilen wie diese an einem Ort, den Sie sicher sind, zuerst ausgeführt wird:

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

Wenn später läuft PHP die Definition von Ihnen gesuchte, wird es schreiben eine Mitteilung wie folgt aus:

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

Dann wissen Sie, dass die Definition von Ihnen gesuchte in der Datei auf der Linie SomeConfiguration.php ist 89.

diese Funktion haben, müssen Sie

  • prüfen, ob HTTP nach vorne auf dem Weg, um den Code im Rahmen sind Sie in
  • gesetzt, wenn es weitere Befehle sind die PHP-Fehlereinstellung Berichtsmodus

Also manchmal hilft es, einige exit('here') hinzuzufügen, um die Ausgabe nicht zu verwischen. Vielleicht müssen Sie etwas eingrenzen, oder Sie müssen error_reporting früher setzen, aber Sie werden es finden.

+0

Hoffe, es hilft und egal wie hässlich es ist :-): :) –

+0

wenn es ... es verdient einen Vorschuss upvote :) .. –