1

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

class DBStorage extends NativeClass{
  public function get($key);
  public function set($key,value);
}

我大部分时间都想使用它,但是,如果我打开系统调试标志。
我希望setandget方法被以下内容重载:

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

我确实尽量避免 IF 的混乱(真实类中有几十个函数)

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

3 回答 3

4

你不能有条件地重载,但是你可以有条件地在重载的方法中做一些事情:

class DBStorage extends NativeClass{

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

}

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

于 2013-02-06T21:18:50.733 回答
0

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

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();
于 2013-02-06T21:20:32.913 回答
0

某事刚来找我

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

}
于 2013-02-06T21:26:16.753 回答