码迷,mamicode.com
首页 > 其他好文 > 详细

自定义laravel函数dd()

时间:2017-08-14 23:33:38      阅读:1284      评论:0      收藏:0      [点我收藏+]

标签:symfony   变量   cti   default   vendor   子进程   使用   生成   ica   

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()

标签:symfony   变量   cti   default   vendor   子进程   使用   生成   ica   

原文地址:http://www.cnblogs.com/iaknehc/p/7360428.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!