PHP项目开发实例(一)(未使用框架)

学习意义

    根据 视频教程 学习PHP基础 和 MVC 框架的学习。     

    了解PHP原生开发一个项目的流程,为以后使用 TP5 和 Laravel 作对比。

    了解一个项目中大概的流程 和 运用到的技术点,以及一些细节的逻辑思想,培养编程逻辑思维。

    GitHub地址    https://github.com/L1633/PHP-shop  有空会慢慢更新。

    用的环境是 phpStudy  5.3.29-nts + Apache

oop思想

    OOPObject Oriented Programming,面向对象编程,面向对象程序设计。

    核心思想:使用人类思考问题、解决问题的方式来编写程序。

    OOP的优点(面向过程对比)

    可维护;可扩展;可重用;灵活度高。

MVC思想

    解释:MVC是一种编程思想,M,model,表示模型,完成具体的业务逻辑,V,view,表示视图,用来展示页面,C,controller,控制器,专门用来负责调度的。

    核心思想:将业务逻辑和显示相分离。

    优缺点:优点,分层明确,便于维护和分工协作,便于交流。缺点,理解比较费劲,学习成本高,对于小项目,反而感觉有些麻烦。

项目搭建    

    项目定位:基于B2C的电子商城

    项目流程

    入口文件 index.php

    在项目中,有许多控制器 和 模型 ,所有就会有共同的代码,需要定义基础控制器和基础模型。

项目流程

    注意:1 良好的项目结构 ;2 统一的命名规范 ;3 单一入口。

    一  项目结构

项目结构
application结构目录
controller结构目录
view结构目录

                 model,模型前后台共用,不用创建admin 和 home;

frame结构目录
public结构目录

        二 项目规范

          命名规范

           ① 一定要有注释 ,注释占整个项目的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 中,然后编写方法。

            静态资源中的引用路径

top.html中的引用路径

            出于安全的考虑,浏览器是不能访问本地资源的。我们不能使用PHP常量路径输出,只能是使用网站的路径(相对路径或者写/)。

            注意:出于安全和效率的考虑,后台的静态资源直接存放到admin之下

            ③ 定义核心控制器

            在项目中,有很多控制器,其中有很多相同的功能,为了实现代码的重用,定义一个基础控制器,其他继承该控制器即可。

            该基础控制器的 功能 和 定义的位置。

            该控制器是前台和后台都会继承的,在其他项目中也可以使用,所以这个控制器和具体的业务逻辑没有关系,应该放到framework------>core中,称之为核心控制器。

            功能划分:

            1 实现操作后的跳转,并提示信息

跳转功能

            message.html 中

meta 标签
代码内容

            ④ 载入数据库模型

                在framework中写入Mysql.class.php数据库操作工具类文件 。

数据库模型

                Mysql中,主要定义的方法(主要是查询返回结果集的操作)

                getOne:获取第一条记录的第一个字段的值,返回单个值。

                getRow:获取单条记录,返回一位数组。

                getAll:获取所有的记录,返回二维数组。

                在我们的项目中,有多个模型,都需要完成增删改查操作。其中增删改比较特殊,他们的sql语句几乎是一样的,可以将其定义成自动完成,将其定义到基础模型中。

基础模型类

                配置数据库参数

配置文件位置
配置内容

               将配置信息要赋值到 超级全局变量config,然后需要载入基础控制器和基础模型,手动强制载入。

代码

            ⑤ 载入工具类和辅助函数

                比如载入 验证码 类,在基础控制器中实现

引入工具类

                其他控制器继承 基础控制器 后就可以引用 library 方法 来引入 验证码类

验证码类
使用方式

        三种加载方式

        APPlication主要就是数据模型库,控制器和视图。控制器和数据库模型有一个显著的特征,就是它们的名字特点,控制器以Controller 结尾,模型以 Model 结尾,使用自动加载来实现。

        Framework 中的一些类,类名和文件本身变化,不能使用自动加载,根据文件的重要程度,分为:强制手动加载 按需手动加载。

强制手动加载

            框架总结

MVC框架

                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属性是否正确;

                     每一个表单域的属性,尽量保证和表中的字段名一致。

注意html文件
添加操作

            ⑤ 显示商品分类

控制器
cat_list.html
显示效果

                无限分类的处理(重点)

                重新排序,要按照分层的效果显示

递归
重新排序

            排序之后就是 缩进显示

给每个子集增加一个层级属性
html
显示效果

        ⑥ 修改商品分类

显示效果
传递当前选择项的id

            注意:编辑时,需要传递修改的当前分类的 cat_id!!!!!!!!

控制器
selectByPk
html页面
传递id
控制器中的修改操作操作

            注意:不能将当前分类的后代或者自己作为其上级分类

注意点

                解决方法

                 ①在显示的时候,不显示当前分类及其后代分类

                 ②在更新之前,判断,如果将当前分类的后代或者自己作为其上级分类,提示不允许。

                第二种处理的方式

获取该类的所有后代id
进行判断

            ⑦ 删除商品分类

                一定要传 删除商品的cat_id !!!!!

删除

                删除商品就像 删除文件夹,2种方法:1.类似递归删除,把父类下的所有子类都删了;2. 提示该类下有子类,不能删除,要先删除 子类,才能删除父类。

第二种方法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,165评论 25 708
  • 第二周 20170819-20170825没有及时把记录发出来,但是绝对也没有偷懒哈。 20170819 周六 H...
    faithfu阅读 281评论 0 0
  • 人从出生到成长的每一天,都在不停的做出选择。 本人,善良,但从小到大就喜欢犹豫不决,拖泥带水,只好美名其曰的对每个...
    浅秋晗阅读 489评论 0 1
  • 这次聚会见到我的女神-朵妈,心情激动不已,初次见面的花粉们一点都不陌生,皆因同频相吸。 谁也想不到当初被她的网易博...
    Apple_2a9e阅读 180评论 0 0