本篇文章給大家分享的是有關(guān)PHP中怎么實(shí)現(xiàn)打印跟蹤調(diào)試信息,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
在成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)中從網(wǎng)站色彩、結(jié)構(gòu)布局、欄目設(shè)置、關(guān)鍵詞群組等細(xì)微處著手,突出企業(yè)的產(chǎn)品/服務(wù)/品牌,幫助企業(yè)鎖定精準(zhǔn)用戶,提高在線咨詢和轉(zhuǎn)化,使成都網(wǎng)站營銷成為有效果、有回報(bào)的無錫營銷推廣。創(chuàng)新互聯(lián)專業(yè)成都網(wǎng)站建設(shè)10余年了,客戶滿意度97.8%,歡迎成都創(chuàng)新互聯(lián)客戶聯(lián)系。
對于大部分編譯型語言來說,比如 C 、 Java 、 C# ,我們都能很方便地進(jìn)行斷點(diǎn)調(diào)試,但是 PHP 則必須安裝 XDebug 并且在編輯器中進(jìn)行復(fù)雜的配置才能實(shí)現(xiàn)斷點(diǎn)調(diào)試的能力。不過,如果只是簡單的調(diào)試并且查看堆棧回溯的話,其實(shí) PHP 已經(jīng)為我們準(zhǔn)備好了兩個(gè)函數(shù),能夠讓我們非常方便的看到程序運(yùn)行時(shí)的調(diào)用情況。
從這個(gè)方法的字面意思上就可以看出,它的意思就是調(diào)試回溯,返回的也正是一段回溯信息的數(shù)組。
function a_test($str) { echo "Hi: $str", PHP_EOL; var_dump(debug_backtrace()); } var_dump(debug_backtrace()); a_test("A"); // Hi: A/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:7: // array(1) { // [0] => // array(4) { // 'file' => // string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php" // 'line' => // int(12) // 'function' => // string(6) "a_test" // 'args' => // array(1) { // [0] => // string(1) "A" // } // } // }
這個(gè)方法必須在函數(shù)中調(diào)用,在函數(shù)方法外部使用是不會有內(nèi)容的。從內(nèi)容中看,它輸出了關(guān)于這個(gè)函數(shù)的 \_\_FILE__ 、 \_\_LINE__ 、 \_\_FUNCTION__ 、$argv 等信息。其實(shí)就是關(guān)于當(dāng)前打印這行所在函數(shù)的相關(guān)內(nèi)容。
我們當(dāng)然也可以多嵌套幾層函數(shù)來看一下打印出的內(nèi)容是什么。
function b_test(){ c_test(); } function c_test(){ a_test("b -> c -> a"); } b_test(); // Hi: b -> c -> a // /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:7: // array(3) { // [0] => // array(4) { // 'file' => // string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php" // 'line' => // int(37) // 'function' => // string(6) "a_test" // 'args' => // array(1) { // [0] => // string(11) "b -> c -> a" // } // } // [1] => // array(4) { // 'file' => // string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php" // 'line' => // int(33) // 'function' => // string(6) "c_test" // 'args' => // array(0) { // } // } // [2] => // array(4) { // 'file' => // string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php" // 'line' => // int(40) // 'function' => // string(6) "b_test" // 'args' => // array(0) { // } // } // }
沒錯(cuò),數(shù)組的輸出順序就是一個(gè)棧的執(zhí)行順序,b_test() 最先調(diào)用,所以它在棧底,對應(yīng)的輸出也就是數(shù)組中的最后一個(gè)元素。
在類中也是類似的使用方法。
class A{ function test_a(){ $this->test_b(); } function test_b(){ var_dump(debug_backtrace()); } } $a = new A(); $a->test_a(); // /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:90: // array(2) { // [0] => // array(7) { // 'file' => // string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php" // 'line' => // int(87) // 'function' => // string(6) "test_b" // 'class' => // string(1) "A" // 'object' => // class A#1 (0) { // } // 'type' => // string(2) "->" // 'args' => // array(0) { // } // } // [1] => // array(7) { // 'file' => // string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php" // 'line' => // int(95) // 'function' => // string(6) "test_a" // 'class' => // string(1) "A" // 'object' => // class A#1 (0) { // } // 'type' => // string(2) "->" // 'args' => // array(0) { // } // } // }
在類中使用的時(shí)候,在數(shù)組項(xiàng)中會多出一個(gè) object 字段,顯示的是這個(gè)方法所在類的信息。
debug_backtrace() 的函數(shù)聲明是:
debug_backtrace ([ int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT [, int $limit = 0 ]] ) : array
其中 \$options 是有兩個(gè)常量可以定義,DEBUG_BACKTRACE_PROVIDE_OBJECT 表明是否填充 "object" 的索引;DEBUG_BACKTRACE_IGNORE_ARGS 是否忽略 "args" 的索引,包括所有的 function/method 的參數(shù),能夠節(jié)省內(nèi)存開銷。 $limits 可用于限制返回堆棧幀的數(shù)量,默認(rèn)為0返回所有的堆棧。
debug_backtrace() 以及下面要介紹的 debug_print_backtrace() 方法都是支持 require/include 文件以及 eval() 中的代碼的,在嵌入文件時(shí),會輸出嵌入文件的路徑,這個(gè)大家可以自行嘗試。
這個(gè)方法從名稱也可以看出,它會直接打印回溯內(nèi)容,它的函數(shù)聲明和 debug_backtrace() 是一樣的,不過 $options 默認(rèn)是 DEBUG_BACKTRACE_IGNORE_ARGS ,也就是說,它只打印調(diào)用所在文件及行數(shù)。
function a() { b(); } function b() { c(); } function c(){ debug_print_backtrace(); } a(); #0 c() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:144] #1 b() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:140] #2 a() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟蹤調(diào)試信息.php:151]
另外就是這個(gè)函數(shù)不需要使用 var_dump() 或 print_r() 進(jìn)行輸出,直接使用這個(gè)函數(shù)就會進(jìn)行輸出。能夠非??旖莘奖愕淖屛覀冞M(jìn)行調(diào)試,比如在 laravel 這類大型框架中,我們在控制器需要查看堆棧信息時(shí),就可以使用 debug_print_backtrace() 快速地查看當(dāng)前的堆棧調(diào)用情況。而 debug_backtrace() 如果沒有指定 $options 的話,則會占用非常大的內(nèi)存容量或者無法完整顯示。
以上就是PHP中怎么實(shí)現(xiàn)打印跟蹤調(diào)試信息,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。