php创建数据对象吗,OO PHP - 如何创建“通用”数据库对象?

继续我的旅程进入更高级的面向对象,我试图想出能够创建一个名为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类,但是你不能有一个有多个潜在父级的子类(你可以吗?)

总而言之 - 我几乎可以肯定我错过了一些东西,我想要做的事情应该既可能也很直接,而且我没有想到正确的方法 - 任何人都可以给我一个指针吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值