Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从已实例化的对象调用方法_Php_Oop - Fatal编程技术网

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

Php 从已实例化的对象调用方法,php,oop,Php,Oop,我需要一个简单的调试类,这样我就可以在整个应用程序运行过程中添加到它,并输出它,查看调试跟踪 class debug { public function __construct(){ $this->debug = ''; } public function set($addition) { $this->debug .= $addition .'<br\/>'; } public function

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

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->debug;
例如:

class user {
    public function __construct() {
        $debugSystem->set('The class 'user' has been created.');
    }
}
$user = new user;
这个新的现在给了我一个错误。我哪里做错了?还有更好的方法吗?

问题在于。在诸如
\uu构造
之类的函数中,像
$debugSystem
这样的全局变量不存在,除非使用

global $debugSystem;

然而,使用globals通常不是一种好的编程实践。与其用<代码> Global < /Cord>声明乱扔代码,不如考虑重新设计代码,这样就不需要它们了。一种方法是将调试类的实现改为使用。

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

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
隐含在
用户
类中。

说出错误的实际内容总是很有用的。$debugSystem在用户类的构造函数中不可见。您必须使用静态调试方法或其他方法..全局变量是邪恶的。静态方法(实际上是伪装的全局方法)也是非常邪恶的。好吧,我可以通过创建2个类来解决这个问题,每个类对应一个用户/系统。非常感谢
class user
{
   private $debugger = null;
   //{...}
   public function setDebugger(Debug $debugger)
   {
      $this->$debugger = $debugger;
   }
}