debug_backtrace()

在我们开发一个项目中,或者二开研究某个开源程序,需要对代码流程一步步去跟踪,来研究它的逻辑,才可以进行修改,达到我们的开发目的。php的内置函数debug_backtrace就具备这个功能,很直观的展示出从系统流程开始到执行终止的位置之前所走过的所有文件,函数,甚至调用的参数,还会具体到某个行数。

这里是官方的说明

http://php.net/manual/zh/function.debug-backtrace.php

下面我来用Thinkphp框架来举例,说明从进入index控制器下的index方法过程中,是怎么走过来的。

<?php

namespace Home\Controller;
use OT\DataDictionary; //index 控制器
class IndexController extends HomeController { //index方法
public function index(){
echo '<pre>';
print_r(debug_backtrace());die; //函数位置 $this->display();
} }

然后执行PHP程序,看结果(从下往上看,才是执行流程)

Array
(
[] => Array
(
[function] => index
[class] => Home\Controller\IndexController
[object] => Home\Controller\IndexController Object
(
[view:protected] => Think\View Object
(
[tVar:protected] => Array
(
) [theme:protected] =>
) [config:protected] => Array
(
) ) [type] => ->
[args] => Array
(
) ) [] => Array
(
[file] => D:\phpStudy\WWW\wwwroot\Runtime\common~runtime.php
[line] =>
[function] => invoke
[class] => ReflectionMethod
[object] => ReflectionMethod Object
(
[name] => index
[class] => Home\Controller\IndexController
) [type] => ->
[args] => Array
(
[] => Home\Controller\IndexController Object
(
[view:protected] => Think\View Object
(
[tVar:protected] => Array
(
) [theme:protected] =>
) [config:protected] => Array
(
) ) ) ) [] => Array
(
[file] => D:\phpStudy\WWW\wwwroot\Runtime\common~runtime.php
[line] =>
[function] => exec
[class] => Think\App
[type] => ::
[args] => Array
(
) ) [] => Array
(
[file] => D:\phpStudy\WWW\wwwroot\ThinkPHP\Library\Think\Think.class.php
[line] => //117行
[function] => run //Think.class.php文件的run方法
[class] => Think\App
[type] => ::
[args] => Array
(
) ) [] => Array
(
[file] => D:\phpStudy\WWW\wwwroot\ThinkPHP\ThinkPHP.php
[line] => //ThinkPHP文件的94行
[function] => start //经过了start函数
[class] => Think\Think
[type] => ::
[args] => Array
(
) ) [] => Array
(
[file] => D:\phpStudy\WWW\wwwroot\index.php
[line] => //第39行
[args] => Array
(
[] => D:\phpStudy\WWW\wwwroot\ThinkPHP\ThinkPHP.php
) [function] => require
) )

说明一下ThinkPHP框架的执行流程:

Index.php加载了Thinkphp.php文件 ---->  ThinkPHP.php执行Think.start() ----> Think.class.php中执行App::run() ----> App.class.php中执行 App::exec() ----->App::exec()中用反射方法调用了控制器

get_included_files()

此函数是打印在项目流程执行过程中被引入的文件

<?php

namespace Home\Controller;
use OT\DataDictionary; //index 控制器
class IndexController extends HomeController { //index方法
public function index(){
echo '<pre>';
print_r(get_included_files());die; $this->display();
} }

打印结果

Array
(
[] => D:\phpStudy\WWW\wwwroot\index.php
[] => D:\phpStudy\WWW\wwwroot\ThinkPHP\ThinkPHP.php
[] => D:\phpStudy\WWW\wwwroot\ThinkPHP\Library\Think\Think.class.php
[] => D:\phpStudy\WWW\wwwroot\ThinkPHP\Library\Think\Storage.class.php
[] => D:\phpStudy\WWW\wwwroot\ThinkPHP\Library\Think\Storage\Driver\File.class.php
[] => D:\phpStudy\WWW\wwwroot\Runtime\common~runtime.php
[] => D:\phpStudy\WWW\wwwroot\Application\Common\Behavior\InitHookBehavior.class.php
[] => D:\phpStudy\WWW\wwwroot\ThinkPHP\Library\Think\Behavior.class.php
[] => D:\phpStudy\WWW\wwwroot\ThinkPHP\Library\Think\Cache.class.php
[] => D:\phpStudy\WWW\wwwroot\ThinkPHP\Library\Think\Cache\Driver\File.class.php
[] => D:\phpStudy\WWW\wwwroot\Application\Home\Conf\config.php
[] => D:\phpStudy\WWW\wwwroot\Application\Home\Common\function.php
[] => D:\phpStudy\WWW\wwwroot\ThinkPHP\Library\Behavior\ReadHtmlCacheBehavior.class.php
[] => D:\phpStudy\WWW\wwwroot\Application\Home\Controller\IndexController.class.php
[] => D:\phpStudy\WWW\wwwroot\Application\Home\Controller\HomeController.class.php
[] => D:\phpStudy\WWW\wwwroot\Application\Common\Api\ConfigApi.class.php
[] => D:\phpStudy\WWW\wwwroot\ThinkPHP\Library\Think\Model.class.php
[] => D:\phpStudy\WWW\wwwroot\ThinkPHP\Library\Think\Db.class.php
[] => D:\phpStudy\WWW\wwwroot\ThinkPHP\Library\Think\Db\Driver\Mysqli.class.php
)

php的内置函数debug_backtrace()与get_included_files()跟踪代码调用(Thinkphp框架举例)的更多相关文章

  1. python_way,day4 内置函数(callable,chr,随机验证码,ord),装饰器

    python_way,day4 1.内置函数 - 下 制作一个随机验证码 2.装饰器 1.内置函数 - 下 callable() #对象能否被调用 chr() #10进制数字对应的ascii码表中的内 ...

  2. Day4 内置函数补充、装饰器

    li = [11,22,33,44]def f1(arg): arg.append(55)#函数默认返回值None,函数参数传递的是引用li = f1(li) print(li)   内置函数补充: ...

  3. Python常用模块中常用内置函数的具体介绍

    Python作为计算机语言中常用的语言,它具有十分强大的功能,但是你知道Python常用模块I的内置模块中常用内置函数都包括哪些具体的函数吗?以下的文章就是对Python常用模块I的内置模块的常用内置 ...

  4. python学习交流 - 内置函数使用方法和应用举例

    内置函数 python提供了68个内置函数,在使用过程中用户不再需要定义函数来实现内置函数支持的功能.更重要的是内置函数的算法是经过python作者优化的,并且部分是使用c语言实现,通常来说使用内置函 ...

  5. day15,内置函数一

    1,复习,如何从生成器里面取值,next(每次取一个值),send(不可以用在第一个,取下一个的时候,给上一个地方传一个值),for(没有break会一直取,直到取完),强制转换(会一次性把数据加载到 ...

  6. python第十二天 生成器,迭代器,内置函数

    第二模块学习:  生成器,迭代器,内置函数 生成器特点:只有在调用时才会生成相应的数据,运行的速度快! 示例: def fil(max):#斐波那契数 n,a,b=0,0,1 #定义初始数据 whil ...

  7. gcc 内置函数

    关于gcc内置函数和c隐式函数声明的认识以及一些推测   最近在看APUE,不愧是经典,看一点就收获一点.但是感觉有些东西还是没说清楚,需要自己动手验证一下,结果发现需要用gcc,就了解一下. 有时候 ...

  8. 关于gcc内置函数和c隐式函数声明的认识以及一些推测

    最近在看APUE,不愧是经典,看一点就收获一点.但是感觉有些东西还是没说清楚,需要自己动手验证一下,结果发现需要用gcc,就了解一下. 有时候,你在代码里面引用了一个函数但是没有包含相关的头文件,这个 ...

  9. Python学习之==>内置函数、列表生成式、三元表达式

    一.内置函数 所谓内置函数就是Python自带的函数 print(all([0,2,3,4])) #判断可迭代的对象里面的值是否都为真 print(any([0,1,2,3,4])) #判断可迭代的对 ...

随机推荐

  1. mysql explain用法和结果的含义

    转自:http://blog.chinaunix.net/uid-540802-id-3419311.html explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择 ...

  2. 主页面刷新 illegalStateException:stream

    其实是:jsonmappingexception:no serializer found for class 由于后台错误堆栈打印很快,只看到illegalStateException:stream ...

  3. Windows 产品激活状态、密钥等信息查看

    目前,大多PC都是预装了微软家的桌面级系统 Windows ,这也算是微软一大得意之作.可是 Windows 产品可不是免费的,是要 $ 的.可能在中国,大多数系统可能是盗版过来的,像当年的雨林木风( ...

  4. IO (五)

    1 序列化和反序列化 1.1 ObjectOutputStream 序列化 1.1.1 概述 ObjectOutputStream将Java对象的基本数据写入OutputStream,可以使用Obje ...

  5. Docker入门之常用命令

    写在前面 细数当前最流行的技术莫过于容器化和人工智能了,而容器化技术能有今天的热度,Docker可谓功不可没. 让我们一起来回顾一下Docker 是什么? 是一种虚拟化技术 能够将应用程序自动部署到容 ...

  6. Jmeter_24个常用函数(分享帖)

    JMeter提供了很多函数,如果能够熟练使用,可以为脚本带来很多方便. JMeter函数是一种特殊值,可用于除测试计划外的任何组件. 函数调用的格式如下所示:${__functionName(var1 ...

  7. SQL FOR XML PATH 和 Stuff 用法

    sql stuff 用法 1.作用 删除指定长度的字符,并在指定的起点处插入另一组字符. 2.语法 STUFF ( character_expression , start , length ,cha ...

  8. JavaScript 基本语法 -- 数据类型 & 变量

    JavaScript都有哪些数据类型呢? 在JavaScript里面,数据类型分为两类:原始类型(primitive type)和对象类型(object type) 1. 原始类型(我的理解,不可分割 ...

  9. Nutch2.2.1在MyEclipse中的安装(window7环境)

    在https://svn.apache.org/repos/asf/nutch/branches/branch-2.2.1/网址里面可以找到Nutch2.2.1版本的资源文件. 1. 在MyEclip ...

  10. iOS-隐藏Navigationbar【导航栏无缝圆滑的隐藏】

    1.ViewController .m - (void)viewDidLoad { [super viewDidLoad]; self.title = @"隐藏导航栏"; UIBu ...