Trova where una variabile è definita in PHP (E / o SMARTY)?

Attualmente sto lavorando a un progetto molto ampio, e sono molto sotto pressione per finirlo presto, e sto avendo un problema serio. Il programmatore che ha scritto queste ultime variables definite in un modo molto strano – le variables di configuration non sono tutte nello stesso file, sono distribuite su tutto il progetto di oltre 500 file e 100k + linee di codice, e sto avendo un pò di tempo per capire where si trova una certa variabile, quindi posso risolvere un problema.
C'è un modo per tenere traccia di questa variabile? Credo che stia usando SMARTY (che non sopporto, a causa di problemi come questo), e la variabile è una variabile di template. Sono abbastanza sicuro che la variabile che sto cercando fosse inizialmente definita come una variabile PHP, quindi quella variabile è passata a SMARTY, quindi mi piacerebbe rintracciare quella di PHP, tuttavia se ciò è imansible – come posso tenere traccia giù where ha definito la variabile per SMARTY?

PS Sono in Vista e non ho accesso ssh al server, quindi 'grep' è fuori questione.

Questo genere di cose è la ragione per cui installo Cygwin su tutte le mie macchine Windows.

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

Non posso immaginare di programmare senza un grep funzionante.

Modo forza bruta, perché a volte le variables smarty non sono assegnate direttamente, ma i loro nomi possono essere memorizzati in variables, concatenati da molte stringhe o essere il risultato di alcune funzioni, che rende imansible trovare nei file semplicemente cercando / greping.

In primo luogo, scrivi la tua function per printingre backtrace leggibile, cioè:

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

Aprire il file smarty principale ( Smarty.class.php per impostazione predefinita) e attorno alla row 580 è presente la function denominata assign . Modificalo per vedere il nome della variabile desiderata:

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

La stessa modifica può essere richiesta per la seconda function – assign_by_ref . Ora dopo aver eseguito lo script dovresti avere un risultato del genere:

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

La seconda row punta al punto in cui la variabile è stata assegnata per la prima volta.

Non è una soluzione perfetta, ma trovo che l' agente ransack sia utile per cercare directory e file di grandi size. Potrebbe aiutarti a restringere le cose. I risultati della ricerca ti permetteranno di leggere la row esatta su cui trova una corrispondenza nel riquadro dei risultati.

Se usi l' editor di netbeans semplicemente "fai clic destro" -> "vai a Definizione"

Oppure ctrl + click sulla variabile.

Se l'editor non riesce a capirlo, puoi ricorrere all'opzione "Trova nei file".

Basta usare uno degli IDE PHP disponibili (o un semplice editor di text come Notepad ++ se sei davvero disperato) e cercare il nome della variabile in tutti i file di origine (la maggior parte degli IDE PHP support anche la ricerca di where sono state definite le funzioni / vars e consente per saltare al pezzo di codice pertinente). Anche se sembra strano che tu non sappia quale pezzo di codice chiami il model (che sia Smarty o qualsiasi altra cosa non contenga davvero). Dovresti essere in grado di eseguire il drill down del codice a partire dall'URI (utilizzando qualsiasi IDE che supporti il ​​debug), perché in questo modo sei obbligato a vedere where è definita tale variabile.

C'è un'ulteriore opzione interessante, brutta come l'inferno ma utile se sei davvero perso.

Se vuoi sapere where THE_NAME stato definito THE_NAME , scrivi righe come queste in un posto che sei sicuro di essere eseguito per primo:

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

Se in seguito PHP eseguirà la definizione che stai cercando, scriverà un avviso come questo:

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

Allora sai che la definizione che stai cercando si trova nel file SomeConfiguration.php sulla row 89.

Per avere questo lavoro, è necessario prendere in considerazione

  • se ci sono in avanti HTTP nel framework sulla strada per il codice impostato
  • se ci sono ulteriori comandi che impostano la modalità di segnalazione degli errori PHP

Quindi a volte aiuta ad aggiungere qualche exit('here') per non rendere sfocato l'output. Forse devi restringere un po 'o devi impostare error_reporting precedenza, ma lo troverai.