2011-08-13 68 views
4

这将会很奇怪。我有一个MySQL数据库类和独立的类。例如:Php从不同的类运行时延伸(扩展为变量?)

class users extends MySQL 

这个类是用户的一般类,所以可以多用几次。 但是有时候,一个“MySQL_DEBUGGED”类存在,如果是这样,我想从它扩展:

class users extends MySQL_DEBUGGED 

我想如果存在继承MySQL_DEBUGGED,否则MySQL的类。如果我把它放到变量中,它会抛出一个错误。怎么做?

+0

我可以问你为什么你有两个不同的类(MYSQL和MYSQL_DEBUGGED)?在我看来,问题是你有两个类,而不是只有一个可以配置为更详细(即:调试)或不是 – laurac

+0

我不知道你在做什么,但如果你只有两个类由于调试,你应该使用一个记录器(即:log4php),并配置它为您的需要 – laurac

回答

1

您只需使用class_exists()函数即可。

if (class_exists('MySQL_DEBUGGED')) { 
    class users extends MySQL_DEBUGGED { 
     .... 
    } 
} else { 
    class users extends MySQL { 
     .... 
    } 
} 

虽然我不会推荐它。有条件地声明类似乎是一场噩梦。

+0

多数民众赞成是正确的,但然后所有的方法必须复制/粘贴,这就是我想避免 – deeped

4

我不认为你可以继承一个名字不是写在PHP脚本中的类。


一个可能的解决办法是:

  • 定义两个类,都被称为MySQL,在两个单独的文件
  • 让你users类始终扩展MySQL类(这意味着其中的一个两个)
  • 根据具体情况,包括:
    • 文件包含“生产” MySQL类,
    • 或包含“发展” MySQL

这样的文件,你的类总是延伸MySQL类 - 但你会包括正确的一个


基本上,在你的主文件,你必须:

if (DEBUG) { 
    require __DIR__ . '/MySQL-debug.php'; 
} 
else { 
    require __DIR__ . '/MySQL-production.php'; 
} 

class users extends MySQL { 
    // ... 
} 

而且两者MySQL-debug.phpMySQL-production.php将包含一个叫MySQL类 - 这将不包含在这两个文件同样的东西,的课程。

+0

+1,这是一个远更好的方式来做到这一点。 – Brad

+0

这看起来更好,但MySQL调试继承MySQL生产:)所以类名不能相同 – deeped

+1

@deeped humph,太糟糕了;那么MySQL-debug和MySQL-production如何扩展一个通用的MySQL常用类,它将包含所有的通用代码? –

1

最简单的解决方案是拥有一个空的“桥”类,并始终从该类继承。

然后,你需要声明两次的唯一类将是空的。

if (class_exists('MySQL_DEBUGGED')) { 
    class MySQLBridge extends MySQL { } 
} else { 
    class MySQLBridge extends MySQL_DEBUGGED { } 
} 

class User extends MySQLBridge { 
    // ... your code ... 
} 

最后在您的网页:

require_once('User.php'); 
$user = new User(); 

其他建议的解决方案需要你有你的继承类,我不建议的两个副本。