2010-06-04 74 views
7

我目前正在研究一個非常大的項目,並且很快就要完成它,並且我面臨嚴重的問題。程序員以非常奇怪的方式編寫了最後一個定義的變量 - 配置變量並不都在同一個文件中,它們遍佈整個500多個文件和100k +代碼行的項目,我正在一時間搞清楚某個變量在哪裏,所以我可以解決一個問題。
有沒有辦法跟蹤這個變量?我相信他正在使用SMARTY(我不能忍受,由於這樣的問題),而變量是一個模板變量。我相當確定,我正在尋找的變量最初被定義爲一個PHP變量,然後該變量被傳遞到SMARTY,所以我想跟蹤一個PHP,但是如果這是不可能的 - 我怎麼跟蹤在他爲SMARTY定義變量的位置?

P.S.我在Vista中,並沒有ssh訪問服務器,所以'grep'是不可能的。找到在PHP(和/或SMARTY)中定義變量的位置?

+1

+1不喜歡Smarty。雖然我自己並沒有使用它們,但我認爲php-debugger和xdebug可以同時回溯外部變量或所有現有變量的變量/內容。無論如何,我爲你的Vista和調試情況點燃了一絲同情心。 – mario 2010-06-04 04:37:16

回答

5

這類事情是我在我的所有Windows機器上安裝Cygwin的首要原因。

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

我無法想象沒有工作的編程grep

+3

嘗試一下,它比grep好。不,真的:http://betterthangrep.com/ – Charles 2010-06-04 01:20:57

+1

神聖煙霧,看起來很棒。從CPAN到現在安裝。 – Nathan 2010-06-04 22:05:29

+0

嘿,我一直在使用ack幾個星期,我喜歡它。再次感謝查爾斯! – Nathan 2010-06-21 18:59:19

2

這不是一個完美的解決方案,但我發現agent ransack用於搜索大型目錄和文件。可能會幫助你縮小範圍。搜索結果將允許您在結果窗格中讀取它找到匹配的確切行。

1

只要使用其中一個可用的PHP IDE(或者像Notepad ++這樣簡單的文本編輯器,如果你真的絕望)並在所有源文件中搜索變量的名稱(大多數PHP IDE也支持查找函數/變量被定義並允許你跳轉到相關的一段代碼)。雖然看起來很奇怪,你不知道代碼是怎樣稱呼模板的(不管它是Smarty還是別的什麼都不重要)。您應該能夠從代碼開始深入瞭解URI(使用任何支持調試的IDE),因爲這樣您就必須查看所定義的變量的位置。

2

如果使用netbeans editor只是「右鍵」 - >在變量「去定義」

或者ctrl + click

如果編輯器找不到它,可以回退到「在文件中查找」選項。

+0

Eclipse和PHPStorm具有相似的功能。 – DanMan 2013-08-19 11:42:47

7

蠻力的方式,因爲有時候smarty變量不是直接賦值的,但是它們的名字可以存儲在變量中,從多個字符串連接起來或者是一些函數的結果,這使得通過簡單搜索/ grep找不到文件。

首先,寫自己的功能打印可讀回溯,即:

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

打開主Smarty的文件(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 2010-06-14 16:26:31

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

希望它有幫助,不管它多麼醜陋:-) :) :) – 2017-01-26 13:36:43

+0

如果它......它值得提前upvote :) .. – 2017-10-20 07:18:03