内容简介:在我们以前的代码中,使用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框架 -封装控制器层
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Numerical Recipes 3rd Edition
William H. Press、Saul A. Teukolsky、William T. Vetterling、Brian P. Flannery / Cambridge University Press / 2007-9-6 / GBP 64.99
Do you want easy access to the latest methods in scientific computing? This greatly expanded third edition of Numerical Recipes has it, with wider coverage than ever before, many new, expanded and upd......一起来看看 《Numerical Recipes 3rd Edition》 这本书的介绍吧!