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

  • 相关阅读:
    常见RGB透明度对照表在这
    Android节假日图标动态替换方案
    用两个栈实现队列
    从头到尾打印链表 (链表/栈)
    MySQL常用函数
    找出数组中重复的数字
    两数之和
    java的list的几种排序写法整理(sort的用法)
    Java知识目录
    通过关键词来推荐话题
  • 原文地址:https://www.cnblogs.com/iaknehc/p/7360428.html
Copyright © 2020-2023  润新知