学习意义
根据 视频教程 学习PHP基础 和 MVC 框架的学习。
了解PHP原生开发一个项目的流程,为以后使用 TP5 和 Laravel 作对比。
了解一个项目中大概的流程 和 运用到的技术点,以及一些细节的逻辑思想,培养编程逻辑思维。
GitHub地址 https://github.com/L1633/PHP-shop 有空会慢慢更新。
用的环境是 phpStudy 5.3.29-nts + Apache
oop思想
OOP:Object Oriented Programming,面向对象编程,面向对象程序设计。
核心思想:使用人类思考问题、解决问题的方式来编写程序。
OOP的优点(面向过程对比)
可维护;可扩展;可重用;灵活度高。
MVC思想
解释:MVC是一种编程思想,M,model,表示模型,完成具体的业务逻辑,V,view,表示视图,用来展示页面,C,controller,控制器,专门用来负责调度的。
核心思想:将业务逻辑和显示相分离。
优缺点:优点,分层明确,便于维护和分工协作,便于交流。缺点,理解比较费劲,学习成本高,对于小项目,反而感觉有些麻烦。
项目搭建
项目定位:基于B2C的电子商城。
项目流程
入口文件 index.php
在项目中,有许多控制器 和 模型 ,所有就会有共同的代码,需要定义基础控制器和基础模型。
注意:1 良好的项目结构 ;2 统一的命名规范 ;3 单一入口。
一 项目结构
model,模型前后台共用,不用创建admin 和 home;
二 项目规范
命名规范
① 一定要有注释 ,注释占整个项目的50%;
② 一定要有统一的命名规范,所有的命名都应该尽量简洁,见名知意。
文件名
类文件,类名.class.php 如 AdminController.class.php;
普通文件,文件名.php
类名,大驼峰命名法,首字母大写,每个单词首字母大写,AdminController
方法名,小驼峰命名法,首字母小写,每个单词首字母大写,checkLogin
属性名,小驼峰命名法 或 下划线方式,保持一致即可。
函数名,下划线 (var_dump)或者 直接连写(imagecreatetruecolor)
在我们的项目中,所有的控制器都是以xxxController命名的。所有的数据库模型都是以xxxModel命名的。
③ 严格区分大小写
Windows下有时候不区分大小写,但是php做的项目通常是放在linux操作系统下,它是严格区分大小写,所以需要养成好的习惯。
④ 注意缩进,代码对齐
三 项目搭建
① 定义核心启动类
framework中的需要写的功能:
实例化对象调用方法,获取pca参数。
所以包含类定义文件---------->自动加载
有这么多的文件,分别存放在不同的目录中,如何处理比较好?
初始化:定义路径常量
路由分发:实例化对象并调用方法
自动加载:实现类的自动加载
函数:getcwd()获取当前工作目录,在项目中获取的是根目录。
DIRECTORY_SEPARATOR常量,路径分隔符,在不同的操作系统下解析为不同的符号,Linux---->/ , Windows------>\ 。
__CLASS__,是魔术常量,表示当前类名
注册函数的另一种写法
spl_autoload_register(‘self::load’);
② 加载视图
将后台首页的html文件放到 views/admin 中,然后编写方法。
静态资源中的引用路径
出于安全的考虑,浏览器是不能访问本地资源的。我们不能使用PHP常量路径输出,只能是使用网站的路径(相对路径或者写/)。
注意:出于安全和效率的考虑,后台的静态资源直接存放到admin之下。
③ 定义核心控制器
在项目中,有很多控制器,其中有很多相同的功能,为了实现代码的重用,定义一个基础控制器,其他继承该控制器即可。
该基础控制器的 功能 和 定义的位置。
该控制器是前台和后台都会继承的,在其他项目中也可以使用,所以这个控制器和具体的业务逻辑没有关系,应该放到framework------>core中,称之为核心控制器。
功能划分:
1 实现操作后的跳转,并提示信息
message.html 中
④ 载入数据库模型
在framework中写入Mysql.class.php数据库操作工具类文件 。
Mysql中,主要定义的方法(主要是查询返回结果集的操作)
getOne:获取第一条记录的第一个字段的值,返回单个值。
getRow:获取单条记录,返回一位数组。
getAll:获取所有的记录,返回二维数组。
在我们的项目中,有多个模型,都需要完成增删改查操作。其中增删改比较特殊,他们的sql语句几乎是一样的,可以将其定义成自动完成,将其定义到基础模型中。
配置数据库参数
将配置信息要赋值到 超级全局变量config,然后需要载入基础控制器和基础模型,手动强制载入。
⑤ 载入工具类和辅助函数
比如载入 验证码 类,在基础控制器中实现
其他控制器继承 基础控制器 后就可以引用 library 方法 来引入 验证码类
三种加载方式
APPlication主要就是数据模型库,控制器和视图。控制器和数据库模型有一个显著的特征,就是它们的名字特点,控制器以Controller 结尾,模型以 Model 结尾,使用自动加载来实现。
Framework 中的一些类,类名和文件本身变化,不能使用自动加载,根据文件的重要程度,分为:强制手动加载 和 按需手动加载。
框架总结
MVC搭建好后,只需要写 application中的内容,也就是mvc(ThinkPHP5中也是在application中写项目内容)
Controller:载入视图
View:html文件,嵌入php 输出从数据库读取的内容
Model:编写sql,调用db对象,如果是增删改,就直接使用自动完成
练习熟练了也很简单!!!!!!
四 数据库设计(难点:以后加强对数据库设计的学习)
PHPCMS系统 有数据库 表和字段的设计,值得参考和学习。
① 数据库设计要点分析
字段类型,数据类型
表间关系
1 字段类型
数值型:整型,tinyint、smallint、mediumint、int、bigint。小数,float、decimal;
字符串:varchar、char、text、(enum和set,很特殊);
日期时间型:date,time,datetime,timestamp。开发中,使用int表示比较常见的;
没有布尔类型,布尔类型如何表示?用enum或者tinyint,用tinyint会方便些;
如果能用小的,就尽量用小的,可以提升效率,节省资源。
2 表间关系
表间关系指的是表与表之间的联系。
表A的一条记录对应表B中有多少条,表B的一条记录对应表A中有多少条。
主要分为:一对一;一对多;多对多。
一对一比较少见,多对多最难。
一对多的表现形式:在多的一方,增加一个外键,关联到一的一方的主键。
多对多的变现形式:将一个多对多的关系转换成两个一对多的关系,需要增加一张中间的关联表。
示例:商品模块数据库设计
数据库的开始,从核心开始。本项目的核心是商品,从goods表开始。
图片的保存分为两个部分,图片本身上传到服务器的某个目录下,在将 它的路径 保存在表中字段。
要点:如何将一张表变成两张表。
判断所要表示的是否是同一种信息:商品信息,分类信息,品牌信息。
关键它们的生命周期是否相同。
在考虑商品的属性:① 通用属性,所有商品都具有的,比如名称,价格,图片等;②扩展属性,也叫规格参数,不同类型的商品其规格参数不同,手机有内存,摄像头像素,分辨率等,衣服有尺码,颜色,材质等。
五 后台功能
1.后台实现流程及实施步骤说明
首先完成:商品管理分类------->商品品牌管理-------->商品类型管理--------->后台登录管理
其实:商品属性管理-------->商品管理
实施步骤:1明确目标 ;2 业务逻辑分析(表结构和表间关系);3 编写代码实现(MVC);4 测试
一控制器、一模型、一表,六个方法,三个视图!!!!!!
2.商品分类管理
① 明确目标:完成商品分类的增删该查(CRUD)
② 业务逻辑分析
parent_id:父分类id ,涉及一个概念: 无限分类
子类的parent_id 是 父类的 cat_id
无限分类:给定一个分类,可以无限制的添加后代分类。
如何实现无限分类呢?
通常要从两个层面来考虑:
数据库的层面,表设计,增加了一个parent_id的字段
程序的层面,具体的实现,需要使用 递归的思想 。
第⑤项 处理 无限分类 ↓↓↓↓↓↓↓
③ 显示添加分类表单
引入cat_add.html文件到views文件夹下
④ 商品分类入库
在cat_add.html 页面中
注意两点:
表单的action属性是否正确;
每一个表单域的属性,尽量保证和表中的字段名一致。
⑤ 显示商品分类
无限分类的处理(重点)
重新排序,要按照分层的效果显示
排序之后就是 缩进显示
⑥ 修改商品分类
注意:编辑时,需要传递修改的当前分类的 cat_id!!!!!!!!
注意:不能将当前分类的后代或者自己作为其上级分类
解决方法
①在显示的时候,不显示当前分类及其后代分类
②在更新之前,判断,如果将当前分类的后代或者自己作为其上级分类,提示不允许。
第二种处理的方式
⑦ 删除商品分类
一定要传 删除商品的cat_id !!!!!
删除商品就像 删除文件夹,2种方法:1.类似递归删除,把父类下的所有子类都删了;2. 提示该类下有子类,不能删除,要先删除 子类,才能删除父类。