宝哥软件园

自制PHP框架的模型和数据库

编辑:宝哥软件园 来源:互联网 时间:2021-09-05

什么是模型?

我们的网络系统将处理各种数据。在实际开发过程中,一个类往往对应关系数据库的一个或多个数据表,因此会出现两个问题。

1.类和数据表,一方的修改会导致另一方的修改。只要数据表结构不确定,业务逻辑的开发就很难启动

2.获取数据时会拼接很多SQL语句。如果数据结构改变,这些SQL需要重写

如果我们想开发一个博客系统,我们首先设计两个模型和两个数据表

第一个数据表名为post,存储博客文章,数据如下:

第二章数据表,名为comment,存储博客文章的评论,数据如下:

帖子和评论是一对多的关系。每个博文对应多个评论,每个评论只属于一篇文章。

在设计模型类之前,我们首先定义三个接口

接口IModel { public static function all();公共静态函数get($ id);公共静态函数,其中($condition,$ value);}定义模型类

类模型实现了IModel { public static $ table公共静态$ dbpublic function _ _ construct(){ self : $ db=new MySQL();}公共静态函数get($ id){ return self : where(' id ',$ id);}public static function,其中($condition,$ value){ $ SQL=sprint f(' select * from % s,其中%s='%s ' '),self:$table,$condition,$ value);返回self : $ db-Query($ SQL);} public static function all(){ $ SQL=sprint f(' select * from % s ',self : $ table);返回self : $ db-Query($ SQL);}}这三个接口分别负责三种查询:遍历查询、条件查询、按编号查询。其实这三个界面的设计并不是最科学的,甚至get方法只是一种特殊形式的where,但是这种设计并不影响我们的项目,甚至有助于我们理解。稍后我们将对此代码进行更改。

之所以在Model类中拼接SQL,是因为不必在子类中重复编写SQL。

然后是Post类的定义

类PostModel扩展了模型{ public $ postidpublic function _ _ construct(){ parent :3360 _ _ construct();parent: $ table=' post}}注释类也有定义

类CommentModel扩展了Model { public $ commentidpublic function _ _ construct(){ parent :3360 _ _ construct();parent : $ table=' comment ';}}我们可以在控制器的方法中编写这样的代码来完成调用数据

$ post=new POSt model();$ post : all();$ arr=$ post : get(' 1 ');var _ dump($ arr);$ comment=new comment model();$ arr=$ comment : get(' 2 ');var _ dump($ arr);我们发现这种代码非常简单,但问题随之而来。当我们查询SQL时,仍然有许多复杂的连接查询,如连接操作,因此拼接SQL是不可避免的。我们稍后将解决这个复杂的问题。

模型和数据库

首先,编写一个数据库抽象类,并指定该类需要实现的方法

抽象类DB { private $ IPprivate $用户;私人$ pwdprivate $ nameprivate $连接;抽象公共函数Execute($ SQL);抽象公共函数Query($ SQL);}以MySQL数据为例,当然也可以实现一套Sqlite数据库接口。

类关系型数据库扩展了DB { public function MySQL(){/* Config */$ this-IP=' * ';$ this-ServerID=' * ';$这个-服务器密码=' * ';$ this-Databasename=' * ';/* Config的结尾*/$ this-connect=MySQL _ connect($ this-IP,$this-ServerID,$this-ServerPassword,$ this-DataBaseName);if(!$this-connection){die('无法连接。$ this-connection);} MySQL _ query($ this-connection,' set name utf8 ');}公共函数Execute($ SQL){ return MySQL _ query($ this-connection,$ SQL);}公共函数Query($ SQL){ $ result=MySQL _ Query($ this-connection,$ SQL);$ arr=array();while($ row=MySQL _ fetch _ array($ result)){ $ arr[]=$ row;}返回$ arr}公共函数Close(){ MySQL _ Close($ this-connection);}}谈到数据库类,上述的写法仍不是最好的,因为我们可以使用单例模式来保证分贝类只有一次初始化,来节省硬件资源的开销,但这不是本节的主题,我们把设计模式放在之后来谈。

更多资讯
游戏推荐
更多+