我的意思是动态更改派生类的基类。例如,有两个类B1
和B2
。当我运行带有参数class=b1
的php脚本时,该脚本中定义的类(例如class D
)应该扩展class B1
否则如果参数为class=b2
它应该扩展{{1} }}。
期待这样的事情
B2
PHP中有这样的选项吗?如果有任何选择,请建议我。
提前致谢。
答案 0 :(得分: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
}
这个对我有用。 :)
答案 1 :(得分: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);
然而,这只是一个例子。您将找到其他方法来阻止动态代码生成,
答案 2 :(得分:1)
在php语言中永远不可能。