dd()是laravel中一个帮助调试脚本的函数,可以打印php中所有类型的变量。它让变量显示的方式变得更加优雅,这也正是laravel框架的一大优点。
首先看看dd()的源码,本文中laravel框架版本为5.1,(对应文件在laravel框架中的目录路径laravel/vendor/laravel/framework/src/Illuminate/Support/helpers.php)
1 function dd() 2 { 3 array_map(function ($x) { 4 (new Dumper)->dump($x); 5 }, func_get_args()); 6 7 die(1); 8 }
这段代码的功能就是将dd()接收过来的所有参数都交给回调函数Dumper->dump()处理,处理完后终止脚本。
接着分析一下class Dumper的源码(对应文件在laravel框架中的目录路径laravel/vendor/laravel/framework/src/Illuminate/Support/Debug/Dumper.php)
1 class Dumper 2 { 3 public function dump($value) 4 { 5 if (class_exists(CliDumper::class)) { 6 $dumper = 'cli' === PHP_SAPI ? new CliDumper : new HtmlDumper; 7 $dumper->dump((new VarCloner)->cloneVar($value)); 8 } else { 9 var_dump($value); 10 } 11 } 12 }
if判断CliDumper类是否存在,这个类主要是处理输出变量时字体颜色、样式、以及一些其他格式化处理,这里不做分析。
CliDumper类在laravel框架中的目录路径laravel/vendor/symfony/var-dumper/Dumper/CliDumper.php
一般如果下载的框架源代码是完整的,这个类文件是存在的。如果不存在就会使用php内置函数var_dump()打印dd()接收的所有变量。
当if判断为true的时候,先对比一下PHP_SAPI。
SAPI:(Server Application Programming Interface,服务端应用编程端口)
php支持的sapi主要有以下几种,现做一下简要说明
CLI:命令行接口,该 CLI SAPI 模块主要用作 PHP 的开发外壳应用
CGI:php早期和web服务器通信的一种模块,效率较低。
FastCGI:是cgi的升级版本,FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一 次。
PHP使用PHP-FPM(FastCGI Process Manager),全称PHP FastCGI进程管理器进行管理。
APACHE2HANDLER:PHP作为Apache模块,Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出 现,
就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计 算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。
ISAPI:是微软提供的一套面向Internet服务的API接口.一个ISAPI的DLL,可以在被用户请求激活后长驻内存,缺点是稳定性不好。
很明显,一般项目开发不会再命令行终端下运行,所以代码中会实例化HtmlDumper类
类HtmlDumper代码如下:
1 class HtmlDumper extends SymfonyHtmlDumper 2 { 3 4 protected $styles = [ 5 //'default' => 'background-color:#fff; color:#222; line-height:1.2em; font-weight:normal; font:12px Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:100000', 6 'default' => 'background-color:#ddd; color:#222; line-height:1.2em; font-weight:normal; font:20px Segoe Print, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:100000', 7 'num' => 'color:#a71d5d', 8 'const' => 'color:#795da3', 9 'str' => 'color:#df5000', 10 'cchr' => 'color:#222', 11 'note' => 'color:#a71d5d', 12 'ref' => 'color:#a0a0a0', 13 'public' => 'color:#795da3', 14 'protected' => 'color:#795da3', 15 'private' => 'color:#795da3', 16 'meta' => 'color:#b729d9', 17 'key' => 'color:#df5000', 18 //'index' => 'color:#a71d5d', 19 'index' => 'color:blue', //将索引样式改为蓝色 20 ]; 21 }
可以尝试着再源代码的基础上做一些改动,如上所示,被注释掉的是源代码中的,没经过改动。
上面对样式style中的default和index项做了一些改动,
首先default项修改了dd()打印时的背景颜色(background)和字体大小(font),修改了字体为Segoe Print,
index项修改了数组索引颜色为蓝色。
改动后dd()调试的效果如下图所示: