查找在PHP(和/或SMARTY)中定义变量的位置?

时间:2010-06-04 00:47:24

标签: php variables smarty definition

我目前正在开展一个非常大的项目,并且很快就要完成它,并且我遇到了严重的问题。编程最后以非常奇怪的方式编写变量的程序员 - 配置变量并非都在同一个文件中,它们分布在整个项目中,包含500多个文件和100k +代码行,而我正在一时间弄清楚某个变量在哪里,所以我可以解决问题 有没有办法跟踪这个变量?我相信他正在使用SMARTY(由于这样的问题我无法忍受),变量是模板变量。我很确定我正在寻找的变量最初被定义为PHP变量,然后该变量被传递到SMARTY,所以我想跟踪PHP一个,但是如果这是不可能的 - 我该如何跟踪他在哪里为SMARTY定义了变量?

附:我在Vista中,并且没有ssh访问服务器,所以'grep'是不可能的。

6 个答案:

答案 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文件中。

要使其正常工作,您必须考虑

  • 如果在通过
  • 中设置的代码的方式框架中有HTTP转发
  • 如果还有其他命令设置PHP错误报告模式

因此,有时添加一些exit('here')会有助于不模糊输出。也许你需要缩小一点,或者你必须提前设置error_reporting,但你会发现它。

答案 3 :(得分:2)

这不是一个完美的解决方案,但我发现agent ransack对于搜索大型目录和文件非常有用。可能会帮助你缩小范围。搜索结果将允许您在结果窗格中读取它找到匹配的确切行。

答案 4 :(得分:2)

如果您使用netbeans editor只需“右键点击” - &gt; “转到定义”

或变量ctrl + click

如果编辑无法弄明白,您可以回退到“在文件中查找”选项。

答案 5 :(得分:1)

只需使用一个可用的PHP IDE(或者像Notepad ++这样的简单文本编辑器,如果你真的很绝望)并在所有源文件中搜索变量的名称(大多数PHP IDE也支持查找函数/变量的位置)定义并允许您跳转到相关的代码段)。虽然看起来很奇怪,你不知道什么代码片段称之为模板(无论是Smarty还是其他任何东西并不重要)。您应该能够从URI开始深入查看代码(使用支持调试的任何IDE),因为这样您就可以看到定义变量的位置。