如何使用其他类的PHP魔术常量?

时间:2010-08-12 06:24:17

标签: php debugging

我在文件info.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调用此方法,其中包含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)

但我想要显示

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

所以,如果我将$more=TRUE放在watch()中,那么我怎么做呢?方法和行号应该是从调用它的类中透明的。

我可以在监听方法中使用self::parent::吗?或者是其他东西 请建议我如何从其他类调用魔术常量或是否有任何其他方法来调试varaibale? (请不要建议使用Xdebug或任何其他工具)

3 个答案:

答案 0 :(得分: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'];
                }

           }
        }
     }

答案 1 :(得分:1)

您无法使用该范围内的常量。请查看函数 debug_backtrace()。如果它给你太多信息,请尝试解析它。

答案 2 :(得分:1)

debug_bactrace是你完全自动化的唯一方法,但它是一个“重型”函数......执行速度很慢,需要解析才能提取所需的信息。这可能看起来很麻烦,但更好的解决方案是将必要的信息传递给Info :: watch方法:

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); 
}