现在的位置: 首页 > PHP开发 > 正文
自定义debug函数观察递归函数是如何运行的
2014年01月23日 PHP开发 ⁄ 共 1315字 暂无评论 ⁄ 被围观 1,435 views+
//debug函数如下:
function debug() {
    $numargs  = func_num_args();
    $arg_list = func_get_args();
    for ($i=1;$i<$numargs;$i++) {
        echo "第${i}个变量的值为",$arg_list[$i],PHP_EOL;
    }
    echo '当前所处的文件名为:',__FILE__,PHP_EOL;
}
//递归函数
function factor($n) {
    $factor = 1;
    for ($i = 1; $i <= $n; $i ++) {
        $factor *= $i;
        debug($factor,$i);
    }
    return $factor;
}
//运行函数
$result = factor(4);

//运行结果如下

第0个变量的值为:1
第1个变量的值为:1
当前所处的文件名为:E:\data\lua\d1.php
第0个变量的值为:2
第1个变量的值为:2
当前所处的文件名为:E:\data\lua\d1.php
第0个变量的值为:6
第1个变量的值为:3
当前所处的文件名为:E:\data\lua\d1.php
第0个变量的值为:24
第1个变量的值为:4
当前所处的文件名为:E:\data\lua\d1.php

总结:通过该函数可很直观的看到代码运行过程中变量值的变化过程。



<?php
//debug_zval_dump()函数输出结果更var_dump类似,唯一不同的是增加了一个值refcount,记录一个变量被引用多少次,这是PHP写时复制机制的一个重要特点,和PHP变量在底层的实现以及内存回收有关。这个函数可以帮我们了解PHP的引用机制  
$debugArr = array(1,2,3);
foreach ($debugArr as $v) {
    $v *= 2;
    debug_zval_dump($v);
}
var_dump($debugArr);
$debugArr2 = array(1,2,3);
foreach ($debugArr2 as &$v) {
    $v *= 2;
    debug_zval_dump($v);
}

var_dump($debugArr2);


//输出结果如下:

//两段代码唯一区别在于引用次数,由于使用了&,操作的是数组本身而不是数组的副本,所以比不用引用的foreach循环少一次变量引用



<?php 
//debug_print_backtrace函数,在遇到一些递归引用或者函数嵌套时,debug_print_backtrace函数能帮助我们查看程序的调用栈,方便清理程序执行的上下文环境。
function a(){
    b();
}
function b(){
    c();
}
function c(){
    debug_print_backtrace();
}
a();

//输出结果如下:

//输出直观地告诉我们,函数c的调用堆栈,根据栈的先进后出特点,输出从下往上看就能清理函数c的调用过程。

给我留言

您必须 [ 登录 ] 才能发表留言!