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

3
我所指的是动态更改派生类的基类。例如有两个类B1B2。当我运行带有参数 class=b1 的php脚本时,该脚本中定义的一个类(称为类D)应该扩展类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选项?如果有,请建议我。提前致谢。

4
这是一个糟糕的设计方法。 - hek2mgl
@hek2mgl:我已经找到了解决方案,请验证一下是否是一个好的方法。 - Prashanth Shyamprasad
3个回答

1
我不建议动态扩展类。虽然这是可能的,但这是一个非常糟糕的设计,会产生很多不必要的副作用。至少可以说一点:你如何为这个类(们)生成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);

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


好运!正如我所提到的,这只是一个如何做的例子。 - hek2mgl

1
我已经找到了解决我的问题的方法。大家请验证这是否是正确的方法。
现在我将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 
}

这个对我来说可以用。:)


@hek2mgl 这是一个好的方法吗? - Prashanth Shyamprasad
我会说不要这样做!!! :) 这个想法本身,动态选择基类,是一个糟糕的设计。我真的很想为您的应用程序提供一个不需要这个的建议,但是我需要更多关于您的应用程序的信息。这可能对stackoverflow来说有点“过分”。 - hek2mgl
@hek2mgl 这只是应用程序的一部分,我正在为我的应用程序编写 ORM。示例中的类 D 将是一个通用类,供用户使用 db。B1、B2 等将是不同类型数据库的不同基类。它的选择取决于存储在配置文件中的值(仅作为示例的参数)。因此,如果选择 mysql,则基类 D 将派生自指定访问 mysql 数据库的基类。 - Prashanth Shyamprasad

1

这在 PHP 语言中永远不可能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接