0

我需要一个简单的调试类,这样我就可以在应用程序的整个运行过程中添加它并输出它并查看调试跟踪。

class debug {
    public function __construct(){
        $this->debug = '';
    }

    public function set($addition) {
        $this->debug .= $addition .'<br\/>';
    }

    public function get(){
        return $this->debug;
    }
}
$debugUser = new debug();
$debugSystem = new debug();

所以我现在有两个对象。使用以下内容,我现在可以为 debugSystem 设置跟踪:

$debugSystem->set('System debug instantiated.');

但是,如果我从不同的类创建一个对象,我不能使用上面的,添加到

$debugSystem->debug;

例如:

class user {
    public function __construct() {
        $debugSystem->set('The class 'user' has been created.');
    }
}
$user = new user;

这个新的现在给了我一个错误。我哪里错了?有没有更好的方法来做到这一点?

4

2 回答 2

1

可能的解决方案是 - 使用静态调试方法。那将是:

class Debug
{
   protected static $debug = '';

   public static function get()
   {
      return self::$debug;
   }

   public static function set($addition)
   {
      self::$debug.=$addition;
   }
}

然后在你的课堂上使用将是:

class user {
    public function __construct() {
        Debug::set('The class "user" has been created.');
    }
}

但是,这可能不是您想要的,因为在这种情况下,您将无法拥有不同的调试器(只有一个静态全局调试器)。通常也有静态方法是不好的(因为它们是某种副作用,即显式上下文并且很难测试)。因此,您的另一个可能的解决方案是为您的类创建注入方法,例如:

class user
{
   private $debugger = null;
   //{...}
   public function setDebugger(Debug $debugger)
   {
      $this->$debugger = $debugger;
   }
}

- 那么你就可以在课堂上使用$this->debugger隐式了。user

于 2013-11-06T10:20:32.380 回答
-1

问题是可变范围之一。在诸如 的函数中__construct,像 your 这样的全局变量$debugSystem不存在,除非您明确声明它们

global $debugSystem;

然而,使用全局变量通常不是一个好的编程习惯。与其在代码中乱扔声明,不如global考虑重新设计代码,以便不再需要它们。一种方法是将调试类的实现更改为使用静态方法

于 2013-11-06T10:18:58.107 回答