最新在大家自己的博客的过程中,发现各种开源的博客系统都或多或少的用起来别扭.于是想动手自己写个博客系统.既然写,就想好好写.那就先写个MVC框架.一点一点来.写的过程中有很多想法.还希望大家能够多多指正.我在这里先把它们记录下来.下面是我对这个系统的一些想法.

1,我要实现一个模块话的博客系统,能够进行二次开发.

2,我要实现apache和nginx的rewrite功能.

3,我要实现对多数据库的支持.包括mongodb和mysql 还有mysqli.等.

4,我要把smarty用起来.

好,下面动手开始写.首先一点我得设计一下这个系统.大概的目录结构是下面这个样子的(我参考了PHPCMS).

/

./log--这个是日志目录.我想把日志记录在这个里面

./system ---这个是系统目录

./lib--这个是系统库.关键的东西都放在这里面

./classes -- 这个是系统的相关类

./configs--这个是系统的配置文件目录

./model--这个是各个数据模型的目录

./modules--这个是各个模块的目录

./base.php--所有的请求都路由到这个文件上面来了,再有这个文件来分发.

./index --我把index也当成一个模块来写

./templates--这个是模板目录

./default--这个是默认的模板目录

./cache--这个是cache目录.

index.php-----------这个是单入口文件,用来路由相关的请求.

MVC框架要把model和ctrl还有view分开.那么就需要url的路由.至于伪静态什么的,后面再说.要先满足最基本的需求.

MVC框架要有个单入口文件,于是第一个文件产生了.就是根目录下面的index.php,这个文件用来接收所有的请求,也就是说所有的请求都是从这个入口进来的.关于单入口的好处,请自行搜索脑补.

每一个数据模型,按照我的理解,应该对应一张或者多张表.比如文章模型.可以单独对文章表.也可以对应作者表and文章表and评论表.

涉及到数据模型就要与数据库打交道了.先不管跟数据库打交道.我最先要实现的是能够路由我的URL

最简单的url     http://域名.com要路由到index模块下的index.php文件里面的index控制器并且执行这个控制器的默认方法(我设置成了init);

既然要有默认的路由参数,我就建立了一个文件.叫default_arg.config.php  存放在/system/lib/configs/default_arg.config.php里面用来返回默认的参数

里面的内容大概是介个样子滴:

return array(

'default' =>

array(

'm'=>'index',

'c'=>'index',

'a'=>'init',

),

);

当我想引用这些配置的时候 .我只需要如下的调用

$configs = include_once($file);

就能够将这个大数组赋值到configs上面,如果没有参数,就使用默认的参数.把默认参数拼接到URL上面.我的默认首页就变成了

http://域名.com/index.php?m=index&c=index&a=init

这一切的功能是怎么实现的哦?

既然访问的是index.php,那就从index.php开始看,其实index里面就几行,

define('ROOT_PATH',dirname(__FILE__));//定义一个系统路径

require_once(ROOT_PATH.DIRECTORY_SEPARATOR.'system'.DIRECTORY_SEPARATOR.'base.php');//引用框架的基础类

$sys = base::getInstance();//得到基础类的实例,基础类是一个单例类

$sys->init();//调用单例类的init方法

其实DIRECTORY_SEPARATOR就是个/,我们可以这样理解.引用了框架里面的base文件.然后调用了里面的getInstance方法.得到了一个实力,最后调用了init方法.

为什么要使用单例类,可以自行百度.这里用单例类比较科学.后面我会把整个类贴上来,下面用到什么就贴什么.

再看看base类里面的getInstance干了些什么.

class base{

public static $sys;

private function __construct(){

return false;

}

public static function getInstance(){

if(!(self::$sys instanceof self)){

self::$sys = new self();

}

return self::$sys;

}

因为是单例类,我把base里面的构造方法声明成了私有的.这是为了防止被new关键字从外部new这个类.为了保证所有操作都是由单一实例来完成的.这个类是不允许在外部new的.

在看看getInstance方法.先判断自己的$sys变量是不是自己的实例.如果不是就将自己的实例赋值给$sys,如果是则不做操作,最后 返回了这个类自己的一个实例.

在看看init方法做了些什么

public static function init(){

self::sys_class('model');

self::sys_class('ctrl');

$args = self::__explan_arg();

$ctrl = self::__load_ctrl($args['m'],$args['c']);

call_user_func(array($ctrl,$args['a']));

}

我在这个基础类里面写了几个方法.如果方法名称前面有两个下划线,就是私有的方法.   有个sys_class就是在指定目录加载系统了.这个目录是/system/lib/class/.  这里加载了model类和ctrl类,就是模型类的基类和控制器类的基类.这个ctrl类是所有控制器的基类.里面可以写一些公共的方法.比如说在构造方法让类中有一个base的实例神马的.让所有的控制器都集成自这个类.这个model类目前还没用到.但是以后的数据模型都应该是来自这个model类的.后面会说.

然后我调用了__explan_arg方法.这个方法就是来解析get得到的参数的.

private static function __explan_arg(){

$default_arg = self::sys_config('default_arg');

$args['m'] = isset($_GET['m'])?$_GET['m']:$default_arg['m'];

$args['c'] = isset($_GET['c'])?$_GET['c']:$default_arg['c'];

$args['a'] = isset($_GET['a'])?$_GET['a']:$default_arg['a'];

return $args;

}

我在第一行使用了一个sys_config方法来加载默认参数.这个方法就是在系统的/system/lib/configs/目录下面找到对应的配置文件,上面已经说过了怎么把数组返回.这样当GET里面没有相应的参数的时候就会使用默认的参数.接下来我们调用了__load_ctrl方法加载了相应的控制器.传入了m和c.这个方法实现的就是到m所指定的目录下面找到c这个文件并且实例化一个c这个类(也就是相应的控制器类.)并且返回相应控制器类的实例.然后我调用了一个call_user_func方法.因为我们没办法在程序里像下面的样子来调用控制器的方法

$ctrl->$args['a'];//这样是没办法调用的

所以我们使用了call_user_func方法来调用相应控制器的方法.

好了,现在再缕缕我们程序的流程.首先访问了index.php-->index.php定义了一个路径,去引用了base类.并且得到了一个base类的实例.还调用了base的init方法.-->base的init方法做了下面的事情-->先去引用了基类model和ctrl-->去解析了url中的参数,得到了m,c,a-->通过m,c来引用相应的控制器,-->调用相应控制器的a方法.然后就会得到相应的输出了.

到此为止我们的框架控制器部分基本算是完成了,默认的args是index,index,init.我们在/modules/index/里面建立一个index.php文件.里面写如下的内容.

class c_index extends ctrl{

public function __construct(){

parent::__construct();

}

public function init(){

echo "hello my mvc!";

}

}

再来访问我们的根域名,那么我们就会得到hello my mvc.这句话的输出.

----------------------------------------------------------------------------------------------------------------------------------

毕竟是自己个人的思路.如果有什么不妥的地方,欢迎大家拍砖,也希望大家能够一起来参与讨论,最近看到php的相关板块不像以前那么火了.还希望大家能够多多来参与发帖和讨论.

PHP学习笔记,自己动手写个MVC的框架 -- base所有代码

iOS学习笔记-自己动手写RESideMenu

代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...

自己动手写PHP MVC框架

自己动手写PHP MVC框架 来自:yuansir-web.com / yuansir@live.cn 代码下载: https://github.com/yuansir/tiny-php-framew ...

java之jvm学习笔记五(实践写自己的类装载器)

java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

.NET MVC 学习笔记(一)— 新建MVC工程

一..NET MVC 学习笔记(一)—— 新建MVC工程 接触MVC有段时间了,一直想找机会整理一下,可是限于文笔太差,所以一直迟迟羞于下手,想到最近做过的MVC项目也有一些了,花点时间整理一下方便以 ...

自己动手写Android插件化框架

自己动手写Android插件化框架 转 http://www.imooc.com/article/details/id/252238   最近在工作中接触到了Android插件内的开发,发现自己这种技 ...

ASP.Net MVC开发基础学习笔记:一、走向MVC模式

一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...

Backbone学习笔记一Backbone中的MVC

原文章地址http://bigdots.github.io/2015/12/01/Backbone学习笔记(一)/#more Backbone.js为复杂WEB应用程序提供模型(models).集合( ...

【Spring学习笔记-MVC-15.1】Spring MVC之异常处理=404界面

作者:ssslinppp       异常处理请参考前篇博客:http://www.cnblogs.com/sssl ...

随机推荐

jsRender 循环for 和props

jsrender提供多重循环方式 1.{{for array}}循环数组 2.{{props object}}循环对象 1.for array的使用

Linq的一些记录

1. IQueryable接口与IEnumberable接口的区别:  IEnumerable 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了, ...

用Linux安装光盘修复GRUB

转载:http://lgn21st.iteye.com/blog/179455 需要开视频会议,我不得零时从Ubuntu切换回去百年难道用一次的WinXP...发现自己的XP系统很混乱...决定重新装 ...

Shell学习笔记 ——第二天

1.显示日期 date  |   cal   cal 2010  cal 2 2010 2.改变文件拥有者 chown 3.改变文件权限 chmod 4.显示当前目录 pwd 5.查看文件尾部内容,并 ...

数据结构-二叉树 C和C++实现

二叉树,指针域具有两个下一节点的特殊链表结构. 先来看看它的结构 (此处补图) 来看程序中需要使用到的概念: 树根:二叉树的第一个节点 子树:对于某一个节点指针域指向的节点,左指针指向的节点为左子节点 ...

Angular4+路由

路由的作用就是(导航):会加载与请求路由相关联的组件,并获取特定路由的相关数据,这允许我们通过控制不同的路由,获取不同的数据,从而渲染不同的页面: 几种常见的路由配置: Angular路由器是一个可选 ...

Python全栈-magedu-2018-笔记3

第三章 - Python 内置数据结构 分类 数值型 int.float.complex.bool 序列对象 字符串 str 列表 list tuple 键值对 集合set 字典dict 数值型 数值 ...

微信小程序-下拉松开弹不回去顶部留一段空白

解决办法: 空白的出现有可能是多次触发下拉事件导致请求过多导致页面反应延迟. 在 onPullDownRefresh 事件里加setTimeout事件延迟下下拉刷新的事件. /** * 页面相关事件处 ...

【AtCoder】AGC031

A - Colorful Subsequence 答案是 \(\prod_{c = 'a'}^{'z'} (cnt[c] + 1)\) #include # ...

手工搭建web项目

https://www.cnblogs.com/skyblue-li/p/5966311.html

php怎么自己写框架,PHP学习笔记,自己动手写个MVC的框架相关推荐

  1. iOS学习笔记-自己动手写RESideMenu

    代码地址如下: http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars ...

  2. php mvc 路由,PHP MVC框架路由学习笔记

    文章主要介绍了PHP MVC框架路由学习笔记的相关资料,需要的朋友可以参考下. 提到PHP开发web,自然离不开开发框架,开发框架为我们提供了灵活的开发方式,MVC层分离,业务解耦等... 第一篇先来 ...

  3. 轻量级HTTP客户端框架—Forest学习笔记

    轻量级HTTP客户端框架-Forest学习笔记 一.Forest 1.1 业务需求 一般情况下是后端提供接口,前端调用,解决需求,但是有的时候为了方便,复用别人的接口(网上的,公共的第三方接口(短信. ...

  4. LiteOS学习笔记-4通信模组之AT框架

    LiteOS学习笔记-4通信模组之AT框架 一.AT客户端简介 什么是AT客户端 AT客户端框架作用 二.串口驱动框架实现 2.1串口初始化 2.2读写缓冲区ring_buffer 2.3读写实现与注 ...

  5. ssm 转发请求_千呼万唤!阿里内部终于把这份SSM框架技术学习笔记分享出来了...

    SSM SSM(Spring+SpringMVC+MyBatis)框架集由Spring.MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容).常作为数据源较简单的web项 ...

  6. AI Studio 飞桨 零基础入门深度学习笔记6.3-手写数字识别之数据处理

    AI Studio 飞桨 零基础入门深度学习笔记6.3-手写数字识别之数据处理) 概述 前提条件 读入数据并划分数据集 扩展阅读:为什么学术界的模型总在不断精进呢? 训练样本乱序.生成批次数据 校验数 ...

  7. 某人写的openCV学习笔记

    原文地址:某人写的openCV学习笔记作者:拔剑 http://blog.csdn.net/thefutureisour 我的OpenCV学习笔记(25):c++版本的高斯混合模型的源代码完全注释 之 ...

  8. 《自己动手写Docker》学习笔记2

    <自己动手写Docker>学习笔记2 1 前言 由于本人毕业设计与云原生领域相关,因此最近在学习Docker相关知识,<自己动手写Docker>涵盖了Docker底层的各类知识 ...

  9. Python学习笔记:Day 7 编写MVC

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

最新文章

  1. 各种函数调用约定及浮点数传参
  2. Android UI开发神兵利器之Icon
  3. python如何输入数字赋值_三、python语法(定义,赋值,注释,输入输出)
  4. 非洲瓜哇JAVA布的特点_java语言的基本特性以及编程细节
  5. MVC之ActionFilterAttribute自定义属性
  6. java环境安装包出现覆盖,请查收
  7. 7-2 地下迷宫探索 (30 分)(C语言实现)
  8. 「管理数学基础」1.2 矩阵理论:线性映射、线性变换T的矩阵表示
  9. matlab中英文文献,matlab外文文献
  10. pc游戏平台_如何提高您在PC游戏中的目标
  11. java 实现word文档的在线签批圈阅(手写批注)
  12. 通过 Dockerfile 搭建标注工具 brat 的镜像
  13. java 连接 websphere_本地java类访问websphere的JNDI
  14. ApiOne URL 调用说明
  15. 思科与华为设备中DHCP配置命令(超详细~~!!)
  16. 服务器架构-架构图(二)
  17. 三态输出门实验报告注意事项_冬季行车注意事项 请广大驾驶员注意出行安全...
  18. 业绩打脸所有人,富士康与苹果依然亲密,立讯精密似未能趁机分羹
  19. 程序员,如何通过自我练习来提升技能?
  20. C语言解析GPS :GPGGA\GPRMC数据

热门文章

  1. 当你使用微信和QQ时,请不要忘记ICQ这个伟大的公司!
  2. 麒麟芯片或“绝版”,华为多系列手机涨价​;一加回应“刘作虎回归OPPO”;DBeaver 7.2 发布| 极客头条
  3. 科技驰援背后:技术没有假期!
  4. 凭什么说 5G 安全无害?
  5. Java 会是首选的最佳编程语言吗?
  6. Laravel 成为最佳 PHP 框架的 14 个理由!
  7. 联通辟谣“不支持华为 5G”;罗永浩称索尼手机不如锤子;Linux 5.2.1 发布 | 极客头条...
  8. 程序员必须掌握的 12 个 JavaScript 技能!
  9. 一文揭秘知乎是如何搞 AI 的 | 技术头条
  10. BAT 争抢的全栈工程师真的存在?