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类只是在添加方法。我想将输出附加到日志,仅在调试类中,附加到每个数据操作方法,这些方法只存在于原始类中。作为记录,包含工厂方法的类不应该是实例化对象的一部分。从调试类扩展的想法也不是一个好主意,因为它限制了将来从更好、更具体的类扩展的能力。作为记录,包含工厂方法的类不应该是实例化对象的一部分。从调试类扩展的想法也不是一个好主意,因为它限制了将来从更好、更具体的类扩展的能力。