继续我的旅程进入更高级的面向对象,我试图想出能够创建一个名为database的类的最佳方式,该类可以愉快地使用即将被弃用的mysql命令,mysqli库,或许还有更多还有其他口味的数据库。
为了简单起见,我希望我的调用代码看起来像这样:
$db = new database("MYSQL", $host,$user,$password,$databaseName);
$db->query("SELECT myField FROM myTable");
while ($ROW = $db->fetch_assoc($QRY)) {
echo $ROW['myField'] . "
";
}当实例化数据库对象时,这是我希望指定MYSQL,MYSQLI,MSSQL或任何我想稍后添加的部分。
我很欣赏我可以通过在database的每个方法中实现switch块来实现我想要的:
class database() {
function __construct($type,$host,$user,$password,$databaseName) {
$this->dbType = $type;
switch ($type) {
case "mysql":
mysql_dao::connect($host,$user,$password,$databaseName);
break;
case "mysqli":
mysqli_dao::connect($host,$user,$password,$databaseName);
break;
case "mssql":
mssql_dao::connect($host,$user,$password,$databaseName);
break;
//other cases
}
}
function query($SQL) {
switch ($this->dbType) {
case "mysql": mysql_dao::query($SQL); break;
case "mysqli": mysqli_dao::query($SQL); break;
case "mssql": mssql_dao::query($SQL); break;
}
}
function fetch_assoc($SQL) {
switch ($this->dbType) {
case "mysql": mysql_dao::fetch_assoc($SQL); break;
case "mysqli": mysqli_dao::fetch_assoc($SQL); break;
case "mssql": mssql_dao::fetch_assoc($SQL); break;
}
}
//other methods....
}...但这似乎令人难以置信的混乱。每次调用database的方法时,代码都会检查它的类型,并从不同的对象调用该方法。
所以我的下一个解决方案就是简单地省略database,只需使用如下所示的调用代码:
$db = new mysql_dao($host,$user,$password,$databaseName);
$db->query("SELECT myField FROM myTable");
while ($ROW = $db->fetch_assoc($QRY)) {
echo $ROW['myField'] . "
";
}...所以我们只是为我们正在使用的数据库类型调用数据库访问对象,但是我也不喜欢那个,如果我想将整个项目从mysql移到mysqli,我不得不寻求取出所有这些对象引用并进行更改。虽然在现代PHP编辑器中这是相当微不足道的,但它仍然不觉得它应该是最好的方式(我现在开始变得理论化而不实际)!
最后,我希望我可以用一个switch语句构建database类:
class database {
function __construct($type,$host,$user,$pass,$db) {
switch ($type) {
default:
case "MYSQL":
return new mysql_dao($host,$user,$pass,$db);
break;
case "MYSQLI":
return new mysqli_dao($host,$user,$pass,$db);
break;
case "MSSQL":
return new mssql_dao($host,$user,$pass,$db);
break;
}
}
}...然后仅仅为各个数据库类型实现与所有其他方法的接口。不幸的是,这不起作用,因为即使database的构造函数返回另一个对象的实例,我也无法调用database->query,因为该方法在数据库对象中不存在。
据我所知,扩展database和mysql_dao / mysqli_dao等类是不对的,因为你必须调用扩展类来使用它的方法,并且我想调用父类,但是使用子元素班。所以这表明database应该扩展dao类,但是你不能有一个有多个潜在父级的子类(你可以吗?)
总而言之 - 我几乎可以肯定我错过了一些东西,我想要做的事情应该既可能也很直接,而且我没有想到正确的方法 - 任何人都可以给我一个指针吗?