2010-08-12 21 views
0

我有一個文件info.php以下功能創建的頁面加載過程中調試變量&數據如何從其他類使用PHP魔術常量?

class Info { 
    static function watch($what,$msg='',$more=FALSE) 
    { 
     echo "<hr/>"; 
     echo "<br/>".$msg.":"; 
     if(is_array($what) || is_object($what)) 
     { 
      echo "<pre>"; 
      print_r($what); 
      echo "</pre>"; 
     } 
     else{ 
       echo $what; 
     } 
     if($more) 
     { 
      echo "<br/>METHOD:".__METHOD__; 
      echo "<br/>LINE:".__LINE__; 
     } 
    } 
} 

現在我把這個方法從另一頁index.php,在那裏我在這個文件我想inculded info.php

調試POST陣列,所以我下面寫代碼

class Testpost { 
    __construct() { // some basic intializtion } 
    function getPostdata($postarray) { 
       $postarray=$_POST; 
    Info::watch($postarray,'POST ARRAY', TRUE); 
} 

一切正常,但方法和LINE下面出現

METHOD:Info::watch(); 
LINE:17 // (where this code is written in Info class) 

但我wantbelow顯示

METHOD: Testpost::gtPostdata() 
LINE:5(where this function is called in Testpost class) 

讓我怎麼做,如果我在watch()$more=TRUE則方法和行號應該從類是diaply它被調用。

我可以使用self::parent::的手錶方法嗎?或別的什麼 請建議我如何從其他類調用魔術常量還是有任何其他方法來調試varaibale? (請不要建議使用Xdebug或任何其他工具)

回答

2

您必須使用debug_backtrace() php函數。

您還有問題的解決方案下面。請享用! :)

<?php 
    class Info { 
     static function watch($what,$msg='',$more=FALSE) 
     { 
      echo "<hr/>"; 
      echo "<br/>".$msg.":"; 
      if(is_array($what) || is_object($what)) 
      { 
       echo "<pre>"; 
       print_r($what); 
       echo "</pre>"; 
      } 
      else{ 
        echo $what; 
      } 
      if($more) 
      { 

       $backtrace = debug_backtrace(); 
       if (isset($backtrace[1])) 
       { 
        echo "<br/>METHOD:".$backtrace[1]['function']; 
        echo "<br/>LINE:".$backtrace[1]['line']; 
       } 

      } 
     } 
    } 
+0

爲什麼ü使用了'$回溯[1]',我們不能用'$回溯[0]'??? 我想如果我使用'$ backtrace [0] ['line']',那麼它會給出正確的行號 – JustLearn 2010-08-12 07:18:04

+0

'$ backtrace [0]'它是「你自己」,就像這個類本身一樣。 '$ backtrace [1]'顯示調用方法的信息被調用 – 2010-08-12 07:28:48

1

您不能使用那個範圍內的那些常量。改爲使用debug_backtrace()代替函數。如果它給了你太多的信息,請嘗試解析它。

1

debug_bactrace是,你可以完全自動化的唯一方法,但它是一個「重型」功能....很慢執行,需要解析,以提取所需的信息。這似乎很麻煩,但一個更好的解決方案是必要的信息傳遞給你的信息::手錶方法:

class Info { 
    static function watch($whereClass,$whereLine,$what,$msg='',$more=FALSE) 
    { 
     echo "<hr/>"; 
     echo "<br/>".$msg.":"; 
     if(is_array($what) || is_object($what)) 
     { 
      echo "<pre>"; 
      print_r($what); 
      echo "</pre>"; 
     } 
     else{ 
       echo $what; 
     } 
     if($more) 
     { 
      echo "<br/>METHOD:".$whereClass; 
      echo "<br/>LINE:".$whereLine; 
     } 
    } 
} 
now i call this method from another page index.php, where i inculded info.php 

class Testpost { 
    __construct() { // some basic intializtion } 
    function getPostdata($postarray) { 
       $postarray=$_POST; 
    Info::watch(__METHOD__,__LINE__,$postarray,'POST ARRAY', TRUE); 
} 
+0

,我已經在我的代碼中執行了,但是我必須每次都寫'__METHOD__'和'__LINE__',這就是爲什麼我提出了問題。 無論如何感謝回覆 – JustLearn 2010-08-13 07:02:18