我不建议动态扩展类。虽然它可能是一个非常糟糕的设计,会产生许多不需要的副作用。至少告诉一个人:您将如何为该类生成 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);
然而,这只是一个例子。您会找到其他方法来防止动态代码生成,