欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

手写一个自己的简单MVC框架myPHP

程序员文章站 2022-03-24 22:34:04
...
myPHP框架

采用的是MVC 思想,应用纯面向对象及项目单一入口,实现的一个自定义的框架。(自己兴趣的练习)

一、项目单一入口

入口文件

myphp\index.php前台

一个网站所有的请求都请求一个文件(入口文件)index.php\admin.php。入口很简单,用于定义一个访问的权限,引入初始化文件

初始化文件

字符集

路径

配置文件

自动加载

系统错误display_errors='on' error_reporting =E_ALL

主要用于实现字符集的设置、路径常量的配置、配置文件、系统错误等,分析URL中的模块或行为,之后自动分发模块与行为(本质就是实例化对象,并调用对象的方法)。Application

控制器C

主要根据用户的请求完成业务逻辑处理。调用模型(M),接收数据,并调用视图类来处理数据,回显数据给用户。

模型M

一个模型对应数据表,模型在代码中体现是一个类。类中的方法就是根据用户的业务请求实现的对数据表的操作SQL语句(用户的请求最终在模型中的体现是一条SQL)。

SQL语句的执行由DB类(本框架中使用的是自已封装的PDO类)来执行。

视图V

主要用于实现将数据显示在HTML页面中。

自己画的图:

手写一个自己的简单MVC框架myPHP

MVC的优势:各司其职,互不干扰,有利于开发中的分工;

有利于代码的重用;

市场上主流的框架基本都满足MVC的思想。

二、搭建框架myPHP

在一个网站中会用很多文件,合理的做法,是使用目录 分门别类的进行存放。

1、目录结构:

对于一个网站有前台部分与后台部分,有两种实现方案:

1、双主机(两个域名),前台与后台各对应一个域名。安全

2、前后台共用一个主机。方便(首先方案)

X:\根据你自己搭的环境的路径\myphp 网站根目录

X:\根据你自己搭的环境的路径\myphp\Admin 网站后台主目录

这里所创的文件夹:

手写一个自己的简单MVC框架myPHP

2、创建主机

在httpd-vhosts.conf配置文件配置

手写一个自己的简单MVC框架myPHP

3、入口文件

在/myphp/下创建index.php文件

手写一个自己的简单MVC框架myPHP

手写一个自己的简单MVC框架myPHP

说明:

在入口文件定义ACCESS常量,在其后的所有的PHP文件中判断此常量,如果有,则表示合法访问,如果没有,则表示非法访问

由于引入的Application.class.php文件中使用命名空间,所以在访问Application类时需要使用非限定访问。Core\Application::run();

拓展:

另一种实现项目单一入口的方案是使用Apache的rewrite机制。

4、初始化文件

a、在core目录创建Application.class.php文件

手写一个自己的简单MVC框架myPHP

先进行测试是否可以访问;注意:在下面我不会截图到class名那里,所有的方法都是在类内的。

b、在Application类中创建setChar方法来完成字符集的设置

手写一个自己的简单MVC框架myPHP

在写入一个私有的静态方法后需要在作为单一出口的公有静态方法访问使其生效:注意:在下面我不会再多截图其他方法的单一出口,都在这里面。

手写一个自己的简单MVC框架myPHP

c、设置系统错误处理方式

手写一个自己的简单MVC框架myPHP

一般在做开发的时候,为防止用户看到错误信息,而出现的不友好界面,故一般性会在php.ini的配置文件display_errors=off;关闭

d、定义目录常量

由于php文件中会频繁的引入文件,被引入的文件存放在目录内,为了统一管理,方便维护,将目录的绝对路径,设置为目录常量

(echo,var_dump是进行一些调式,查看你想要的信息是否正确)

手写一个自己的简单MVC框架myPHP

e、引入配置文件

配置文件中的配置的信息一般是网站中可能会更改,但很少更改的信息

创建配置文件myphp/config/config.php

手写一个自己的简单MVC框架myPHP

说明:

php文件中的return是将数据返回文件包含语句处(include、require)

手写一个自己的简单MVC框架myPHP

总结:

全局变量 只在全局

局部变量 只在定义的函数内

类属性 可以跨方法使用

全局常量 可以跨类使用

$_SESSION 可以跨脚本使用

f、自动加载

__autoload(); 由PHP自动加载机制调用的

spl_autoload_register(); 由PHP为我们提供的可以向自动加载机制中添加多个类似于__autoload()的函数。

手写一个自己的简单MVC框架myPHP

调试要在单入口进行测试:

手写一个自己的简单MVC框架myPHP

手写一个自己的简单MVC框架myPHP

其他文件夹的自动加载:一般只加载有类文件的文件夹

手写一个自己的简单MVC框架myPHP

手写一个自己的简单MVC框架myPHP

注册指定函数作为自动加载函数:

手写一个自己的简单MVC框架myPHP

说明

所有loadCore、loadController、loadModel等,都被autoLoad调用,

autoLoad又在run方法中被调用

所有的类的实例化及类的方法的运动是在index.php中

5、分析URL

所有的请求的本质者是一个URL,都请求提Application,如果想让Application能够准确知道用户的请求,要由哪一个类文件的哪一个方法处理,那么网站占所有的URL的设置要有一定的规则,类文件名也要有一定的规则:

l URL的规则:

http://localhost/index.php?module=类名&action=类中的方法名

l 类的命名规则:

如果是控制器类:

类名Controller 文件名: 类名Controller.class.php

如果是模型类:

类名Model 文件名: 类名Model.class.php

手写一个自己的简单MVC框架myPHP

6、分发请求

(本质是动态实例化控制器,调用控制器的方法)

手写一个自己的简单MVC框架myPHP

7、开起session

手写一个自己的简单MVC框架myPHP

注意:所有的方法都要在单一出口访问

手写一个自己的简单MVC框架myPHP

总结:

l 所有的php文件的运行都在index.php文件中。

l application只处理控制器(controller)文件

l controller控制器文件处理model模型文件

l application之所以能够将根据用户的请求,准确的调用类中的方法,完全依赖于我们定义的url的规则与类的命名规则。

应用命名空间:

命名空间的命名的规则,是以文件所在的目录名为命名空间名。

如果涉及到空间,那么一定要考虑到类名前会有空间名。

8、效果显示

当访问网址的时候会进行默认的路由转发:

手写一个自己的简单MVC框架myPHP

手写一个自己的简单MVC框架myPHP

进行其它控制器的方法访问,通过url

手写一个自己的简单MVC框架myPHP

手写一个自己的简单MVC框架myPHP

补充:pathinfo模式可以通过$_SERVER['PATH_INFO'];

手写一个自己的简单MVC框架myPHP

手写一个自己的简单MVC框架myPHP

大致就是这样,其它一些等以后我有空再补充,我还有很多需要学习的。

座右铭:人生就是不断地在学习,再学习。