您的位置:首页 > 编程语言 > PHP开发

利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载

2015-01-12 09:39 615 查看
简述

可能大家都知道,php中有一个函数叫debug_backtrace,它可以回溯跟踪函数的调用信息,可以说是一个调试利器。

好,来复习一下

01    one();
02
03    function one() {
04        two();
05    }
06
07    function two() {
08        three();
09    }
10
11    function three() {
12        print_r( debug_backtrace() );
13    }
14
15    /*
16    输出:
17    Array
18    (
19        [0] => Array
20            (
21                [file] => D:\apmserv\www\htdocs\test\debug\index.php
22                [line] => 10
23                [function] => three
24                [args] => Array
25                    (
26                    )
27
28            )
29
30        [1] => Array
31            (
32                [file] => D:\apmserv\www\htdocs\test\debug\index.php
33                [line] => 6
34                [function] => two
35                [args] => Array
36                    (
37                    )
38
39            )
40
41        [2] => Array
42            (
43                [file] => D:\apmserv\www\htdocs\test\debug\index.php
44                [line] => 3
45                [function] => one
46                [args] => Array
47                    (
48                    )
49
50            )
51
52    )
53    */


顺便提一下类似的函数:debug_print_backtrace,与之不同的是它会直接打印回溯信息。

回来看debug_backtrace,从名字来看用途很明确,是让开发者用来调试的。直到有一天我注意到它返回的file参数,file表示函数或者方法的调用脚本来源(在哪个脚本文件使用的)。忽然我想到,如果当前脚本知道调用来源,那是否可以根据这个来源的不同,来实现一些有趣的功能,比如文件权限管理、动态加载等。

实战

实现魔术函数

获取当前函数或方法的名称

尽管PHP中已经有了__FUNCTION____METHOD__魔术常量,但我还是想介绍一下用debug_backtrace获取当前函数或者方法名称的方法。

代码如下:

01    call_user_func('import');
02
03    function import() {
04        $debug_backtrace = debug_backtrace();
05        $backtrace = $debug_backtrace[0];
06        if( !isset( $backtrace['file'] ) ) {
07            //使用反射API获取函数声明的文件和行数
08            $reflection_function = new ReflectionFunction( $backtrace['function'] );
09            $backtrace['file'] = $reflection_function->getFileName();
10            $backtrace['line'] = $reflection_function->getStartLine();
11        }
12        print_r($backtrace);
13    }
14
15    /*
16    输出:
17    Array
18    (
19        [function] => import
20        [args] => Array
21            (
22            )
23
24        [file] => F:\www\test\test\index.php
25        [line] => 5
26    )


View Code
可以看到通过使用反射接口ReflectionMethod的方法,file又回来了。

类方法的反射接口是ReflectionMethod,获取声明方法同样是getFileName

总结

在一个项目中,我通常不会直接使用include或者require载入脚本。我喜欢把它们封装到一个函数里,需要载入脚本的时候调用这个函数。这样可以在函数里做一些判断,比如说是否引入过这个文件,或者增加一些调用规则等,维护起来比较方便。

幸好有了这样的习惯,所以我可以马上把debug_backtrace的一些想法应用到整个项目中。

总体来说debug_backtrace有很好的灵活性,只要稍加利用,可以实现一些有趣的功能。但同时我发现它并不是很好控制,因为每次调用任何一个方法或函数,都有可能改变它的值。如果要使用它来做一些逻辑处理(比如说我本文提到的一些想法),需要一个拥有良好规范准则的系统,至少在加载文件方面吧。

读后感:

这篇文章是转自一位网友的,它让我对PHP的debug_backtrace()函数有了更深的理解,不过,我还是不太赞成作者对该函数的如此应用:

1、多次调用debug_backtrace(),会出现性能问题,耗内存;

2、debug_backtrace()函数在日志调试跟踪的时候比较有用、好用;

3、接下来再去研究一下该函数在 PHP调试及日志系统 中的应用;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: