我目前正在开展一个非常大的项目,并且很快就要完成它,并且我遇到了严重的问题。编程最后以非常奇怪的方式编写变量的程序员 - 配置变量并非都在同一个文件中,它们分布在整个项目中,包含500多个文件和100k +代码行,而我正在一时间弄清楚某个变量在哪里,所以我可以解决问题
有没有办法跟踪这个变量?我相信他正在使用SMARTY(由于这样的问题我无法忍受),变量是模板变量。我很确定我正在寻找的变量最初被定义为PHP变量,然后该变量被传递到SMARTY,所以我想跟踪PHP一个,但是如果这是不可能的 - 我该如何跟踪他在哪里为SMARTY定义了变量?
附:我在Vista中,并且没有ssh访问服务器,所以'grep'是不可能的。
答案 0 :(得分:9)
蛮力方式,因为有时智能变量不是直接分配的,但是它们的名称可以存储在变量中,从许多字符串连接起来或者是某些函数的结果,这使得无法通过简单的搜索/ greping在文件中找到它们。
首先,编写自己的函数来打印可读的回溯,即:
function print_backtrace()
{
$backtrace = debug_backtrace(FALSE);
foreach($backtrace as $trace)
echo "{$trace['file']} :: {$trace['line']}<br>";
}
打开主要智能文件(默认情况下为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
第二行指向首次分配变量的位置。
答案 1 :(得分:8)
这是我在所有Windows机器上安装Cygwin的首要原因。
grep myvariablename `find project_dir -name "*.php"`
如果没有合作grep
,我无法想象编程。
答案 2 :(得分:4)
还有一个有趣的进一步选择,像地狱一样难看,但如果你真的迷失了,那就很有帮助。
如果您想知道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
然后您知道您要查找的定义位于第89行的SomeConfiguration.php
文件中。
要使其正常工作,您必须考虑
因此,有时添加一些exit('here')
会有助于不模糊输出。也许你需要缩小一点,或者你必须提前设置error_reporting
,但你会发现它。
答案 3 :(得分:2)
这不是一个完美的解决方案,但我发现agent ransack对于搜索大型目录和文件非常有用。可能会帮助你缩小范围。搜索结果将允许您在结果窗格中读取它找到匹配的确切行。
答案 4 :(得分:2)
答案 5 :(得分:1)
只需使用一个可用的PHP IDE(或者像Notepad ++这样的简单文本编辑器,如果你真的很绝望)并在所有源文件中搜索变量的名称(大多数PHP IDE也支持查找函数/变量的位置)定义并允许您跳转到相关的代码段)。虽然看起来很奇怪,你不知道什么代码片段称之为模板(无论是Smarty还是其他任何东西并不重要)。您应该能够从URI开始深入查看代码(使用支持调试的任何IDE),因为这样您就可以看到定义变量的位置。