内容简介:在我们以前的代码中,使用smarty编写程序,程序中的模板文件其实就是View,php文件则是Controller与Model的综合,现在要做的就是从中抽取除模型层,那么MVC的架构就可以了。模型层如何创建呢?所谓模型层,就是上篇文章最后一张图中的 model 目录
1. 前言
在我们以前的代码中,使用smarty编写程序,程序中的模板文件其实就是View,php文件则是Controller与Model的综合,现在要做的就是从中抽取除模型层,那么MVC的架构就可以了。
2. 如何创建模型层
模型层如何创建呢?
所谓模型层,就是上篇文章最后一张图中的 model 目录
模型层的主要作用是操作数据库,准确的说,其实操作的是数据库的表,所以我们的原则是
- 模型层中的一个类对应的是数据库中的一张表
- 模型层中的方法主要的作用是对表中的数据进行增加、伤处、修改、查询等操作
模型层中的类的命名应该遵循如下的原则
- 表名+Model.class.php。Model后缀的作用是为了通过名字区分类是否模型层的类
- 模型名称应使用大驼峰写反,如UserModel.class.php、UserItemModel.class.php
3. 创建模型类
在model目录下创建模型,用来操作test数据库中的users表
编写代码
模型类要操作数据库,所以首先要连接数据库,我们将连接数据的代码写倒构造函数中
另外,我们使用PDO的方式操作数据库,所以将原来封装好的PDO操作类和接口也拷贝到model目录中
<?php require_once 'PdoDAO.class.php'; class UsersModel { private $dao; public function __construct() { //因为操作的不是默认的yhb_blog数据库,所以这里传递一个配置项 $config = [ 'dbname'=>'test' ]; $this->dao= PdoDAL::getSingleInstance($config); } }
也可以新建一个initDao方法,将初始化数据库连接的代码放到此方法中,然后再构造函数中调用,这样构造函数中的代码更加精简,因为后续会再构造函数中写其他代码
<?php require_once 'PdoDAO.class.php'; class UsersModel { private $dao; public function __construct() { $this->initDao(); } private function initDao() { //因为操作的不是默认的yhb_blog数据库,所以这里传递一个配置项 $config = [ 'dbname' => 'test' ]; $this->dao = PdoDAL::getSingleInstance($config); } }
在模型类中加入方法,用于向表中插入数据
public function users_add(){ $sql="insert into users values('libai','libai','李白')"; return $this->dao->query($sql); }
4. 创建模型基类
数据库中很多表,系统中用到的表都需要创建对应的模型类
如还需要为account表创建模型类
<?php class Account{ private $dao; public function __construct() { $this->initDao(); } private function initDao() { //因为操作的不是默认的yhb_blog数据库,所以这里传递一个配置项 $config = [ 'dbname' => 'test' ]; $this->dao = PdoDAL::getSingleInstance($config); } public function account_add(){ $sql="insert into account(name,cart,money) values('李白','212255544558844552',10000)"; return $this->dao->query($sql); } }
当前项目结构如下
我们发现,两个模型类中有重复的代码,也就是在构造函数中初始化数据库连接,而且随着模型类的增多,重复代码会越来越多,这对于后期的维护比较麻烦
最好是将数据库初始化代码放到一个地方,这样维护起来方便
我们的策略是创建模型基类
在model中新建Model.class.php
<?php require_once 'PdoDAO.class.php'; class Model{ //为了在派生类中使用,这里修饰符要改成protected protected $dao; public function __construct() { $this->initDao(); } private function initDao() { //因为操作的不是默认的yhb_blog数据库,所以这里传递一个配置项 $config = [ 'dbname' => 'test' ]; $this->dao = PdoDAL::getSingleInstance($config); } }
然后UsersModel和AccountModel两个类都继承此基类
以UsersModel类为例
<?php require_once 'Model.class.php'; class UsersModel extends Model { public function users_add() { $sql = "insert into users values('libai','libai','李白')"; return $this->dao->query($sql); } }
5. 工厂类创建模型对象
模型类在外部使用时,需要 实例化
同一个模型类可能在很多页面都需要实例化
如果某一天,模型类的构造方法发生更改,参数个数发生变化,那么所有使用此模型类的地方就都要更改,这样维护起来很麻烦
我们还是希望能够一次更改,处处生效
解决方案就是使用工厂类创建类的对象,所有页面都调用这个类中的方法获取创建的对象
class Factory{ public static function M($classname){ static $model_list=array(); if (!isset($model_list[$classname])){ require_once $classname.".class.php"; $model_list[$classname]=new $classname; } return $model_list[$classname]; } }
总结:
1)此方法返回的时单例模式的对象
2)此方法在使用require_once 引入文件时考虑并不周全
下面可以新建一个 php 文件,使用此工厂类的方法创建对象
require_once 'model/Factory.php'; $user1=Factory::M("UsersModel"); var_dump($user1); echo '<br>'; $user2=Factory::M("UsersModel"); var_dump($user2); echo '<br>'; $user3=Factory::M("UsersModel"); var_dump($user3);
通过输出结果,我们发现创建的是一个对象
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 封装JDBC—非框架开发必备的封装类
- Mybatis: 动手封装ORM框架
- Flutter 基于Bloc框架的封装
- 优雅地实现Android主流图片加载框架封装,可无侵入切换框架
- 基于spring boot框架进行二次封装,微型框架编写思路
- 自定义MVC框架 -封装控制器层
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learning PHP, MySQL, JavaScript, and CSS
Robin Nixon / O'Reilly Media / 2012-9-3 / USD 39.99
If you're familiar with HTML, you can quickly learn how to build interactive, data-driven websites with the powerful combination of PHP, MySQL, and JavaScript - the top technologies for creating moder......一起来看看 《Learning PHP, MySQL, JavaScript, and CSS》 这本书的介绍吧!