利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载
2015-01-12 09:39
615 查看
简述
可能大家都知道,php中有一个函数叫debug_backtrace,它可以回溯跟踪函数的调用信息,可以说是一个调试利器。
好,来复习一下
顺便提一下类似的函数:debug_print_backtrace,与之不同的是它会直接打印回溯信息。
回来看debug_backtrace,从名字来看用途很明确,是让开发者用来调试的。直到有一天我注意到它返回的file参数,file表示函数或者方法的调用脚本来源(在哪个脚本文件使用的)。忽然我想到,如果当前脚本知道调用来源,那是否可以根据这个来源的不同,来实现一些有趣的功能,比如文件权限管理、动态加载等。
实战
实现魔术函数
获取当前函数或方法的名称
尽管PHP中已经有了__FUNCTION__和__METHOD__魔术常量,但我还是想介绍一下用debug_backtrace获取当前函数或者方法名称的方法。
代码如下:
View Code
可以看到通过使用反射接口ReflectionMethod的方法,file又回来了。
类方法的反射接口是ReflectionMethod,获取声明方法同样是getFileName。
总结
在一个项目中,我通常不会直接使用include或者require载入脚本。我喜欢把它们封装到一个函数里,需要载入脚本的时候调用这个函数。这样可以在函数里做一些判断,比如说是否引入过这个文件,或者增加一些调用规则等,维护起来比较方便。
幸好有了这样的习惯,所以我可以马上把debug_backtrace的一些想法应用到整个项目中。
总体来说debug_backtrace有很好的灵活性,只要稍加利用,可以实现一些有趣的功能。但同时我发现它并不是很好控制,因为每次调用任何一个方法或函数,都有可能改变它的值。如果要使用它来做一些逻辑处理(比如说我本文提到的一些想法),需要一个拥有良好规范准则的系统,至少在加载文件方面吧。
读后感:
这篇文章是转自一位网友的,它让我对PHP的debug_backtrace()函数有了更深的理解,不过,我还是不太赞成作者对该函数的如此应用:
1、多次调用debug_backtrace(),会出现性能问题,耗内存;
2、debug_backtrace()函数在日志调试跟踪的时候比较有用、好用;
3、接下来再去研究一下该函数在 PHP调试及日志系统 中的应用;
可能大家都知道,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调试及日志系统 中的应用;
相关文章推荐
- 利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载
- __利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载
- (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】
- 利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载
- JAVAWEB开发之Servlet3.0新特性的使用以及注解的详细使用和自定义注解的方法、动态代理的使用、利用动态代理实现细粒度的权限控制以及类加载和泛型反射
- php利用位运算,实现权限管理
- PHP巧妙利用位运算实现网站权限管理
- PHP巧妙利用位运算实现网站权限管理
- Vue + Element UI 实现权限管理系统 前端篇(十):动态加载菜单
- PHP巧妙利用位运算实现网站权限管理的方法
- 利用java反射机制 读取配置文件 实现动态类加载以及动态类型转换
- 利用java反射机制 读取配置文件 实现动态类加载以及动态类型转换
- ASP中利用execute实现动态包含文件的方法
- TreeView加载不同sitemap文件实现简单权限控制
- 利用反射实现类的动态加载
- 利用已有数据库结合ASP.NET2.0权限管理机制实现权限分配
- Acegi+hibernate 动态实现基于角色的权限管理
- 用php实现动态生成rss文件
- Acegi+hibernate 动态实现基于角色的权限管理
- 利用动态加载模板,配合ajax实现无刷新操作