自定义laravel函数dd()

Posted iaknehc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义laravel函数dd()相关的知识,希望对你有一定的参考价值。

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()调试的效果如下图所示:

以上是关于自定义laravel函数dd()的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段8——声明函数

php 一个自定义的try..catch包装器代码片段,用于执行模型函数,使其成为一个单行函数调用

转: Laravel 自定义公共函数的引入

laravel5.6laravel 自定义公共函数

laravel自定义公共函数

在 Laravel 中使用 dd() 函数