博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP 实现对象的持久层,数据库使用MySQL
阅读量:6493 次
发布时间:2019-06-24

本文共 5335 字,大约阅读时间需要 17 分钟。

http://www.xuebuyuan.com/1236808.html

心血来潮,做了一下PHP的对象到数据库的简单持久层。

不常用PHP,对PHP也不熟,关于PHP反射的大部分内容都是现学的。

目前功能比较弱,只是完成一些简单的工作,对象之间的关系还没法映射,并且对象的成员只能支持string或者integer两种类型的。

成员变量的值也没有转义一下。。。

下面就贴一下

首先是数据库的相关定义,该文件定义了数据库的连接属性:

 

 

下面是数据库访问的简单封装:

 

其实上面的两个文件都是之前写好的,持久层的东西是下面的:

 

hasProperty('tablename')) { throw new Exception("Class '$class' has no [tablename] property"); } $table = $r->getStaticPropertyValue('tablename'); if (!$r->hasProperty('id')) { throw new Exception("Class '$class' has no [id] property"); } $mpts = Array (); $pts = $r->getProperties(ReflectionProperty :: IS_PUBLIC); foreach ($pts as $pt) { if (!$pt->isStatic()) { array_push($mpts, $pt); } } return Array ( $table, $mpts ); } function SinORM_GetPropertyString($pts, $class, $obj = false, $noid = false) { if (is_null($pts)) { list ($tb, $pts) = SinORM_GetClassPropertys($class); } $s = false; $v = false; $l = false; foreach ($pts as $pt) { $name = $pt->name; if ($noid == false || $name != 'id') { if ($l) { $s = $s . ','; } $s = $s . $name; if ($obj) { if ($l) { $v = $v . ','; } $val = $pt->getValue($obj); if (is_null($val)) $v = $v . 'null'; if (is_string($val)) $v = $v . "'$val'"; else $v = $v . $val; } $l = true; } } return Array ( $s, $v ); } function SinORM_GetTableName($class){ $r = new ReflectionClass($class); if (!$r->hasProperty('tablename')) { throw new Exception("Class '$class' has no [tablename] property"); } $table = $r->getStaticPropertyValue('tablename'); if (!$r->hasProperty('id')) { throw new Exception("Class '$class' has no [id] property"); } return $table; } function SinORM_ResetORM($class) { list ($tb, $pts) = SinORM_GetClassPropertys($class); $sql = "CREATE TABLE `$tb` (`id` int NOT NULL AUTO_INCREMENT"; $r = new ReflectionClass($class); $obj = $r->newInstance(); foreach ($pts as $pt) { $val = $pt->getValue($obj); $name = $pt->name; if ($name != 'id') { $sql = $sql . ','; } else { continue; } if (is_null($val)) throw new Exception($class . '->' . "name must have a default value"); if (is_string($val)) $sql = $sql . "`$name` text NULL"; else $sql = $sql . "`$name` int NULL"; } $sql = $sql . ",PRIMARY KEY (`id`));"; $dsql = "DROP TABLE IF EXISTS `$tb`;"; return SinORM_ExecSql($dsql) && SinORM_ExecSql($sql); } function SinORM_SaveObject($obj) { $class = get_class($obj); list ($tb, $pts) = SinORM_GetClassPropertys($class); list ($names, $vals) = SinORM_GetPropertyString($pts, $class, $obj, true); $sql = "INSERT INTO `$tb`($names) values($vals)"; if(SinORM_ExecSql($sql)){ $q = "SELECT `id` FROM `$tb` ORDER BY `id` DESC LIMIT 1;"; $id = SinORM_ExecResult($q); if($id){ $obj->id = $id; } } return false; } function SinORM_GetObjects($class) { list ($tb, $pts) = SinORM_GetClassPropertys($class); $sql = "SELECT * from `$tb`;"; $ary = SinORM_ExecArray($sql); $res = false; if (is_array($ary)) { $res = Array (); $ref = new ReflectionClass($class); foreach ($ary as $a) { $obj = $ref->newInstance(); foreach ($pts as $pt) { $name = $pt->name; $olv = $pt->getValue($obj); $val = $a[$name]; if (is_string($olv)) $pt->setValue($obj, $val); else $pt->setValue($obj, intval($val)); } array_push($res, $obj); } } else { echo 'no'; } return $res; } function SinORM_GetObject($class, $id) { list ($tb, $pts) = SinORM_GetClassPropertys($class); $sql = "SELECT * from `$tb` where `id`=$id;"; $ary = SinORM_ExecArray($sql); $res = null; if (is_array($ary) && count($ary) > 0) { $res = Array (); $ref = new ReflectionClass($class); $a = $ary[0]; $obj = $ref->newInstance(); foreach ($pts as $pt) { $name = $pt->name; $olv = $pt->getValue($obj); $val = $a[$name]; if (is_string($olv)) $pt->setValue($obj, $val); else $pt->setValue($obj, intval($val)); } return $obj; } return null; } function SinORM_Update($obj) { $class = get_class($obj); list ($tb, $pts) = SinORM_GetClassPropertys($class); $sql = "UPDATE `$tb` SET "; $l = false; foreach ($pts as $pt) { $name = $pt->name; $val = $pt->getValue($obj); if ($name == 'id') continue; if ($l) $sql = $sql . ','; if (is_string($val)) $sql = $sql . "$name='$val'"; else $sql = $sql . "$name=$val"; $l = true; } $sql = $sql . " WHERE `id`=$obj->id;"; return SinORM_ExecSql($sql); } function SinORM_SaveOrUpdate($obj) { if (SinORM_GetObject(get_class($obj), $obj->id) == null) { SinORM_SaveObject($obj); } else { SinORM_Update($obj); } } function SinORM_DeleteObject($obj){ $class = get_class($obj); $tb = SinORM_GetTableName($class); $sql = "DELETE FROM `$tb` WHERE `id`=$obj->id;"; return SinORM_ExecSql($sql); } function SinORM_DeleteAll($class){ $tb = SinORM_GetTableName($class); $sql = "DELETE FROM `$tb`;"; return SinORM_ExecSql($sql); }?>

下面是使用的例子:

name = 'TRB'; $user1->age = 22; $user1->email = 'trbbadboy@qq.com'; SinORM_SaveObject($user1); // 把对象保存到数据库中 // 保存之后会自动给id的 $id = $user1->id; echo $id . '
'; $user2 = SinORM_GetObject('User', $id); // 通过ID从数据库创建一个对象 echo $user2->name . '
'; $user1->name = 'trb'; // 改变一下 SinORM_Update($user1); // 更新到数据库 $user3 = SinORM_GetObject('User', $id); // 重新读出 echo $user3->name . '
';?>

转载地址:http://rmkyo.baihongyu.com/

你可能感兴趣的文章
爱上MVC~Web.Config的Debug和Release版本介绍
查看>>
条款03 尽可能使用const
查看>>
【转】那些年我们一起清除过的浮动
查看>>
python__高级 : 动态添加 对象属性, 类属性, 对象实例方法, 类静态方法, 类方法...
查看>>
【每天一道算法题】时间复杂度为O(n)的排序
查看>>
NLog的介绍使用
查看>>
Haproxy+Rabbitmq中的问题
查看>>
字符串变量小议
查看>>
232. Implement Queue using Stacks
查看>>
Poj(1469),二分图最大匹配
查看>>
和菜鸟一起学linux之V4L2摄像头应用流程【转】
查看>>
spin_lock、spin_lock_irq、spin_lock_irqsave区别【转】
查看>>
删除 mac 垃圾桶内清除不掉的文件
查看>>
【响应式编程的思维艺术】 (5)Angular中Rxjs的应用示例
查看>>
/bin/bash^M: bad interpreter: No such file or dire
查看>>
python xml rpc
查看>>
Java设置以及获取JavaBean私有属性进阶
查看>>
db2表结构导出导入,数据库备份
查看>>
策略模式
查看>>
第二 周作业总结
查看>>