PHP代码调试技巧总结

2018-01-23 14:50:00
linefo
原创
1881



总结一些我个人的代码调试经验


【1】在浏览器输出变量等值


一般来说,可以使用var_dump()函数输出类型和值,并跟上exit关键字结束程序执行。



这种方式一般针对普通的输入URL访问的情况。


【2】获取某个函数其声明的文件


使用反射类:

echo (new ReflectionFunction('函数名'))->getFileName();exit;


【3】了解程序执行引用文件的路径


通过 register_shutdown_function()get_included_files() 两个函数可以实现这个功能。


一般来说,程序执行都是走 公共文件(配置、函数、类库)——>业务控制文件——>模板文件 这条线的,我们在一个尽可能都被引用到的公共文件加上类似下面的代码:


<?php
/*自加,查看执行文件顺序*/

function show_include(){
        $arr = get_included_files();
        echo "<script>";
        foreach($arr as $value){
            echo "console.log('".str_replace("", "/", $value)."');";
        }
        echo "</script>";
}
register_shutdown_function("show_include");


就能在浏览器的控制台看到文件引用的顺序了,这样对调试很有帮助



PS:如果是去响应ajax请求,上面这种调用js输出的形式会导致无法正常返回想要的数据。至少在用jquery发起ajax时,HTTP头部请求信息会包含 X-Requested-With 的值,在PHP中用 $_SERVER["HTTP_X_REQUESTED_WITH"] 可以判断是否ajax请求。


【扩展】获取ajax请求时,引用的各文件路径


为了能够在获取文件的路径时,ajax操作也能正常执行,我们可以把相应信息放到http头部信息



function show_include(){
    $arr = get_included_files();
    $include_files = implode(";", $arr); // 数组转字符串
    $include_files = str_replace('\\', '/', $include_files); // 不想要反斜杠
    header("include_files:".$include_files); // 放到头部信息那里去
}
register_shutdown_function("show_include");




在一次ajax请求中查看:



【4】获得调用的函数里面变量的值


使用 register_shutdown_function() 函数来实现这个功能。


首先在一个尽可能都被引用到的公共文件设置一个用以输出值的函数:



function show_var($var){
    echo "<script>";
    echo "console.log('".$var."')";
    echo "</script>";
}


然后在调用到的函数里面,再使用 register_shutdown_function() 注册上面那个函数(需要赋值参数)


register_shutdown_function("show_var", $var);


目前要获得像var_dump那种直观的结构我还没想到好办法,后面想到了再补上。


【5】获取错误的信息


基本上能拿到各种错误的信息,但某些时候不管用,还没有总结


(1)错误报告设置


一般来说,在最先执行的部分加下面的代码就好了:

ini_set("display_errors", "On"); // 确保错误提示开启
error_reporting(E_ALL); // 错误报告级别


但有时候比较坑,项目引入了大量脚本文件,可能某个脚本又设置错误报告级别为不显示,如果不好找的话,这时候可以用第二种方式


(2)使用register_shutdown_function()和error_get_last()函数



<?php register_shutdown_function('get_error');
    function get_error()
    {
        if ($error = error_get_last()) {
            var_dump('<b>register_shutdown_function: Type:' . $error['type'] . ' Msg: ' . $error['message'] . ' in ' . $error['file'] . ' on line ' . $error['line'] . '</b>');
        }
    }



error_get_last函数可以获取最后一次错误的信息。

文章分类
联系我们
联系人: Mr.Chen
QQ: 185391277