php中的条件重载

php中的条件重载,php,preprocessor,overloading,Php,Preprocessor,Overloading,可能是我遗漏了一些明显的东西。 我有一个带有set和get方法的本地类 class DBStorage extends NativeClass{ public function get($key); public function set($key,value); } 我希望在大多数情况下都使用它,但是,如果我打开系统调试标志。 我希望使用以下方法重载set和get方法: IF DEBUG IS ON{ class DBStorage extends NativeClass{

可能是我遗漏了一些明显的东西。
我有一个带有set和get方法的本地类

class DBStorage extends NativeClass{
  public function get($key);
  public function set($key,value);
}
我希望在大多数情况下都使用它,但是,如果我打开系统调试标志。
我希望使用以下方法重载
set
get
方法:

IF DEBUG IS ON{
    class DBStorage extends NativeClass{
      public function get($key){
         var_dump($key);
         parent::get($key);
      }
      public function set($key,$value){
         var_dump($key,$value);
         parent::set($key,$value);
      }
    }
}
NativeClass是用C编写的。它是一个扩展(phpredis,但它不相关)。 我将如何做到这一点? 我是PHP的5.3分支

只是为了确保…如果“调试”处于关闭状态,
DBStorage
将:

 class DBStorage extends NativeClass{}
如果“调试”处于启用状态,则将:

class DBStorage extends NativeClass{
      public function get($key){
         var_dump($key);
         parent::get($key);
      }
      public function set($key,$value){
         var_dump($key,$value);
         parent::set($key,$value);
      }
    }
我确实试图避免IFs的混乱(在真正的类中有几十个函数)


不能有条件地重载,但可以在重载方法中有条件地执行某些操作:

class DBStorage extends NativeClass{

    public function get($key) {
       if (DEBUG) {
           var_dump($key);
       }
       return parent::get($key);
    }

}

如果“调试”处于关闭状态,它会将参数直接传递给父方法,并返回父方法的返回值,就像什么都没有发生一样。

您不能有条件地重载,但可以有条件地在重载方法中执行某些操作:

class DBStorage extends NativeClass{

    public function get($key) {
       if (DEBUG) {
           var_dump($key);
       }
       return parent::get($key);
    }

}

如果“调试”处于关闭状态,它会将参数直接传递给父方法,并返回父方法的返回值,就像什么都没发生一样。

由于类构造中的If,您的初始代码将无法编译。为什么不只提供一个调试成员变量,如果为true,则返回输出,或推送到日志文件中

class NativeClass
{
    public $debug = false;
}

class DBStorage extends NativeClass
{
    public function get($key)
    {
        if (true === $this->debug) {
            error_log(sprintf('Key: %s', $key));
        }

        parent::get($key);
    }
}

// Calling code
$dbo = new DBStorage();

$dbo->debug = true;

$dbo->doStuff();

您的初始代码将无法编译,因为类构造中存在if。为什么不只提供一个调试成员变量,如果为true,则返回输出,或推送到日志文件中

class NativeClass
{
    public $debug = false;
}

class DBStorage extends NativeClass
{
    public function get($key)
    {
        if (true === $this->debug) {
            error_log(sprintf('Key: %s', $key));
        }

        parent::get($key);
    }
}

// Calling code
$dbo = new DBStorage();

$dbo->debug = true;

$dbo->doStuff();

我突然想到一件事

class nodebug extends NativeClass{
  static public function create(){
        if(DEBUG) return new DebugNativeClass;
        return new self;
  }
}

class DebugNativeClass extends nodebug{
    public function set($key,$value){
       var_dump($key,$value);
       parent::set($key,$value);
    }

    public function get($key){
       var_dump($key);
       return parent::set($key);
    }

}

我突然想到一件事

class nodebug extends NativeClass{
  static public function create(){
        if(DEBUG) return new DebugNativeClass;
        return new self;
  }
}

class DebugNativeClass extends nodebug{
    public function set($key,$value){
       var_dump($key,$value);
       parent::set($key,$value);
    }

    public function get($key){
       var_dump($key);
       return parent::set($key);
    }

}

我知道这不会搞笑,这是一段伪代码,用来展示我试图实现的目标。至于你的建议,虽然它显然会起作用,但这不是我在这里尝试做的(请参阅我问题中的最后一条评论),所以你想有条件地检查是否处于调试模式,而不带条件?是的,请参阅上面我提出的内容。好的,那么你想复制一个需要调试信息的整个类(或方法),为了避免使用多个条件,原始类是C语言的,我的none debug类只是在添加方法。我想将输出附加到日志中,仅在调试类中,附加到每个数据操作方法中,这些方法只存在于原始类中。我知道这不会搞笑,这是显示我试图实现的伪代码。至于你的建议,虽然它显然会起作用,但这不是我在这里尝试做的(请参阅我问题中的最后一条评论),所以你想有条件地检查是否处于调试模式,而不带条件?是的,请参阅上面我提出的内容。好的,那么你想复制一个需要调试信息的整个类(或方法),为了避免使用多个条件,原始类是C语言的,我的none debug类只是在添加方法。我想将输出附加到日志,仅在调试类中,附加到每个数据操作方法,这些方法只存在于原始类中。作为记录,包含工厂方法的类不应该是实例化对象的一部分。从调试类扩展的想法也不是一个好主意,因为它限制了将来从更好、更具体的类扩展的能力。作为记录,包含工厂方法的类不应该是实例化对象的一部分。从调试类扩展的想法也不是一个好主意,因为它限制了将来从更好、更具体的类扩展的能力。