1. 程式人生 > >自定義laravel函數dd()

自定義laravel函數dd()

背景顏色 pos 註釋 12px style 幫助 die 處理 cati

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