【问题标题】:how to use PHP magic constants from other classes?如何使用来自其他类的 PHP 魔术常量?
【发布时间】:2010-08-12 15:55:37
【问题描述】:

我在文件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或任何其他工具)

【问题讨论】:

    标签: php debugging


    【解决方案1】:

    你必须使用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'];
                    }
    
               }
            }
         }
    

    【讨论】:

    • 为什么你用$backtrace[1],我们不能用$backtrace[0]吗???我想如果我使用$backtrace[0]['line'] 那么它会给出正确的行号
    • $backtrace[0] 它是“你自己”,就像在课堂上一样。 $backtrace[1] 显示调用 info 的方法被调用的行
    【解决方案2】:

    您不能在该范围内使用这些常量。请改用 debug_backtrace() 函数。如果它为您提供了太多信息,请尝试解析它。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我已经在我的代码中做了,但我每次都必须写__METHOD____LINE__,这就是我问问题的原因..无论如何感谢您的回复
      猜你喜欢
      • 1970-01-01
      • 2021-07-29
      • 2023-04-07
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      相关资源
      最近更新 更多