Jon*_*Jon 9 php variables definition smarty
我目前正在开展一个非常大的项目,并且很快就要完成它,并且我遇到了严重的问题.编程最后以非常奇怪的方式编写变量的程序员 - 配置变量并非都在同一个文件中,它们分布在整个项目中,包含500多个文件和100k +代码行,而我正在一时间弄清楚某个变量在哪里,所以我可以解决一个问题.
有没有办法跟踪这个变量?我相信他正在使用SMARTY(由于这样的问题我无法忍受),变量是模板变量.我很确定我正在寻找的变量最初被定义为PHP变量,然后该变量被传递到SMARTY,所以我想跟踪PHP一个,但是如果这是不可能的 - 我该如何跟踪在他为SMARTY定义变量的地方?
PS我在Vista中,并没有ssh访问服务器,所以'grep'是不可能的.
蛮力方式,因为有时聪明的变量没有直接分配,但它们的名字可以存储在变量中,从许多字符串连接起来或是某些函数的结果,这使得无法通过简单的搜索/ 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)
第二行指向首次分配变量的位置.
这种事情是我在所有Windows机器上安装Cygwin的首要原因.
grep myvariablename `find project_dir -name "*.php"`
Run Code Online (Sandbox Code Playgroud)
我无法想象没有工作的编程grep.
还有一个有趣的进一步选择,虽然很难看,但如果你真的迷路了,它会很有帮助。
如果您想知道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 行中。
要使其发挥作用,您必须考虑
因此有时添加一些内容exit('here')以避免输出模糊会有所帮助。也许你必须缩小一点范围,或者你必须error_reporting早点设置,但你会找到它。
| 归档时间: |
|
| 查看次数: |
11103 次 |
| 最近记录: |