自定義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()