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

Jon*_*Jon 9 php variables definition smarty

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

PS我在Vista中,并没有ssh访问服务器,所以'grep'是不可能的.

dev*_*ler 9

蛮力方式,因为有时聪明的变量没有直接分配,但它们的名字可以存储在变量中,从许多字符串连接起来或是某些函数的结果,这使得无法通过简单的搜索/ greping在文件中找到它们.

首先,编写自己的函数来打印可读的回溯,即:

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

打开主要的smarty文件(Smarty.class.php默认情况下)和第580行附近有一个名为assign的函数.修改它以观察所需的变量名称:

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

第二个函数 - 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
Run Code Online (Sandbox Code Playgroud)

第二行指向首次分配变量的位置.


Nat*_*han 8

这种事情是我在所有Windows机器上安装Cygwin的首要原因.

grep myvariablename `find project_dir -name "*.php"`
Run Code Online (Sandbox Code Playgroud)

我无法想象没有工作的编程grep.

  • 试试ack,它比grep更好.不,真的:http://betterthangrep.com/ (3认同)

pet*_*oak 6

还有一个有趣的进一步选择,虽然很难看,但如果你真的迷路了,它会很有帮助。

如果您想知道THE_NAME定义的位置,请在您确定首先运行的位置写入如下行:

error_reporting(E_ALL);
define('THE_NAME', 'Chuck Norris');
Run Code Online (Sandbox Code Playgroud)

如果稍后 PHP 运行你正在寻找的定义,它会写出这样的通知:

Notice: Constant THE_NAME already defined 
in /home/there/can-rip-a-page-out-of-facebook.com/SomeConfiguration.php on line 89 
Run Code Online (Sandbox Code Playgroud)

然后您就知道您要查找的定义位于文件SomeConfiguration.php第 89 行中。

要使其发挥作用,您必须考虑

  • 如果框架中有 HTTP 转发到您设置的代码
  • 是否还有其他命令设置PHP错误报告模式

因此有时添加一些内容exit('here')以避免输出模糊会有所帮助。也许你必须缩小一点范围,或者你必须error_reporting早点设置,但你会找到它。