Php从不同的类运行时扩展(扩展为变量?)

时间:2011-08-13 16:02:36

标签: php class variables inheritance

这很奇怪。我有一个MySQL的数据库类和独立的类。例如:

class users extends MySQL

此类是用户的通用类,因此可以使用更多次。 但偶尔会出现一个“MySQL_DEBUGGED”类,如果有,我想从中扩展:

class users extends MySQL_DEBUGGED

如果存在,我想继承MySQL_DEBUGGED,否则继承MySQL类。如果我把它变成变量,它会丢失一个错误。怎么做?

3 个答案:

答案 0 :(得分:4)

我认为你不能继承一个名字没有在PHP脚本中编写的类。


可能的解决方案是:

  • 在两个单独的文件中定义两个名为MySQL的类
  • 让您的users课程一直延伸MySQL班级(这意味着其中一个)
  • 视情况而定,包括:
    • 包含“production”MySQL
    • 的文件
    • 或包含“development”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的类 - 当然,这两个文件中不包含相同的内容。

答案 1 :(得分:1)

您需要做的就是使用class_exists()功能。

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

我不会推荐它。有条件地宣布课程似乎是一场噩梦。

答案 2 :(得分: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();

其他建议的解决方案要求您拥有继承类的两个副本,我不建议这样做。