在PHP中有动态扩展类的选项吗?


Is there any option for dynamical extension of class in PHP?

我的意思是动态地更改派生类的基类。例如,有两个类B1B2。当我运行一个带有参数class=b1的php脚本时,在该脚本中定义的类(比如class D)应该扩展class B1,否则如果参数是class=b2,它应该扩展B2

期待这样的事情

class B1{
    // some codes 
}
class B2{
    // some codes 
}
switch($_GET['class']){
   case 'b1': $baseclass = "B1"; break;
   case 'b2': $baseclass = "B2"; break;
}

class D extends $baseclass{
    // some codes 
}

PHP中有这样的选项吗?如果有其他选择,请告诉我。

我不建议动态扩展类。虽然这可能是一个非常糟糕的设计,将有许多不必要的副作用。至少告诉一个问题:您将如何为该类生成API文档?(知道这是最小的问题)

从评论中获得的额外信息:你想要构建类似ORM的东西,可以与不同的数据库一起工作,我首先考虑的是PDO。它允许使用相同的接口访问大量的数据库。

如果你出于某种原因需要一个非PDO的解决方案,你可以这样设计:

<?php
class DatabaseStorage {
    /**
     * @var DB_Mysql|DB_SQLite|DB_Postgres ...
     */
    protected $database;

    /**
     * @param DB_Mysql|DB_SQLite|DB_Postgres ... The inner database to be used
     */
    public function __construct($database) {
        $this->database = $database;
    }
    /**
     *  Connect to the database
     */
    public function connect($host, $user, $password) {
        $this->database->connect($host, $user, $password);
    }

    /**
     * Query the database
     */
    public function query($query) {
        return $this->database->query($query);
    }
    // other methods may follow
}

然后像这样使用类:

$databaseType =$_GET['databaseType'];
// you should check the value before using it!!
/*if(!is_valid_database_type($databaseType)) {
    die('BAD input');
}*/
$databaseClass = 'Database' . $databaseType;
$database = new $databaseClass();
// use $database as argument to the storage constructor
$storage = new DatabaseStorage($database);

然而,这只是一个例子。您将找到其他防止动态代码生成的方法,

我已经找到了解决问题的方法。伙计们,请验证这是否是一个正确的方法。

现在我将B1和B2存储在两个独立的文件中,但类名相同,并且需要动态地使用所需的文件。

b1.php
class B{
    // some codes 
}
b2.php
class B{
    // some codes 
}

现在像这样扩展D

$baseclass = $_GET['class'];
require_once($baseclass.'.php');
class D extends B{
    // some codes 
}

这个适合我。:)

这在php语言中是不可能的。