从已经实例化的对象调用方法

时间:2013-11-06 10:14:57

标签: php oop

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

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;

这个新的现在给我一个错误。我哪里错了?还有更好的方法吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

问题是variable scope之一。在诸如__construct之类的函数中,除了使用

明确声明它们之外,全局变量(如$debugSystem)不存在
global $debugSystem;

然而,使用全局变量通常不是一个好的编程习惯。您应该考虑重新设计代码,以便不需要它们,而不是使用global声明乱丢代码。一种方法是将调试类的实现更改为使用static methods