2010-08-12 46 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