自己动手写PHP框架(一)

来源:互联网 发布:linux内核调试ida 编辑:程序博客网 时间:2024/05/18 02:13

作者:沙袋

作为PHP Coder的入门进阶,自己动手写一个MVC框架可以从各方面巩固和加深你对PHP的理解,还能了解一些架构方面的基础知识。

1. 什么是MVC

MVC(Model-View-Controller,模型-视图-控制器)是PHP最常见的一种开发模式。它将程序划分为三层。
* 最上面的一层,是直接面向最终用户的”视图层”(View)。它负责给用户提供操作界面,是程序的外壳。
* 最底下的一层,是核心的”模型层”(Model),负责检索、组织和处理程序所需的数据或信息。
* 中间的一层,就是”控制层”(Controller),它负责根据用户从”视图层”输入的指令,选取”模型层”中的数据,然后根据业务逻辑对其进行相应的操作,并产生最终结果。

2. 起步

文件结构如下
框架文件结构

www目录将作为网站的根目录,可以在Apache或Nginx的vhost配置中将www指定为Document Root,将核心代码放在根目录以外,使得用户无法直接访问到核心代码,提高整站的安全性。

3. 入口

既然www是根目录,那www下的index.php就可以作为整站的入口,当然,你也可以在www下继续写usercenter.php、admin.php等来作为其它模块的入口,你只需要制定规则就好。

而作为入口,由于它可以接收到发往它的所有数据,因此可以按照框架制定的路由规则对数据进行分发处理。因此,在入口,需要引入初始化程序,然后进行路由分发。

/* Nova/www/index.php */<?php//给目录定义一些常量define('ROOT_DIR', __DIR__.'/..');define('APP_DIR', ROOT_DIR.'/Application');define('CONFIG_DIR', ROOT_DIR.'/config');define('FRAMEWORK_DIR', ROOT_DIR.'/Framework');define('LOG_DIR', ROOT_DIR.'/logs');define('WWW_DIR', __DIR__.'/');//设置一下站点的时区define('TIMEZONE', 'Asia/Shanghai');ini_set('data.timezone', TIMEZONE);//引入初始化程序require FRAMEWORK_DIR.'/init.php';

4. 初始化程序

/* Nova/Framework/init.php */<?phpnamespace Nova\Framework;//引入配置文件require CONFIG_DIR . '/config.php';引入自动加载类require 'Autoloader.php';//初始化自动加载Autoloader::init();//启用SessionSession::start();//启动核心处理程序$core = new Core;$core->run();

初始化的过程涉及到了自动加载类及Session的处理,这两部分我们稍后介绍。先来说说核心处理程序,我把路由分发逻辑放在了这里。

5. 核心处理程序

/* Nova/Framework/Core.php */<?phpnamespace Nova\Framework;class Core{    public function run()    {        $this->setReporting();        $this->route();    }    /**     * 设定整站的错误报告等级     */    public function setReporting()    {        if (DEBUG_MODE === true) {            error_reporting(E_ALL);            ini_set('display_errors', 'On');        } else {            error_reporting(E_ALL);            ini_set('display_errors', 'Off');            ini_set('log_errors', 'On');            ini_set('error_log', LOG_DIR . 'error.log');        }    }    /**     * 路由规则     *     * 使用$_REQUEST['act']来定位控制器的类     * 使用$_REQUEST['st']来定位具体的方法     */    public function route()    {        //如果$_REQUEST中没有'act',则设定默认act为index        if (!isset($_REQUEST['act'])) {            $_REQUEST['act'] = 'index';        }        //如果$_REQUEST中没有'st',则设定默认act为main        if (!isset($_REQUEST['st'])) {            $_REQUEST['st'] = 'main';        }        //根据act定位控制器类        $className = 'Nova\\Application\\Controllers\\' . $_REQUEST['act'];        //判断控制器类是否存在,不存在则报404        if (!class_exists($className)) {            header('HTTP/1.1 404 Not Found');            die($className);        }        //生成目标控制器类对象        $obj = new $className();        //判断方法是否存在,不存在则报404        if (!method_exists($obj, $_REQUEST['st'])) {            header('HTTP/1.1 404 Not Found');            exit;        }        //执行目标方法        $obj->$_REQUEST['st']();    }}

你可以在Github上查看Nova项目的源代码。

如果你有任何问题或建议,可以扫描下方二维码或者为微信搜索[phpjiagoushier],关注我的微信公众号[PHP架构师],与我交流互动。
phpjiagoushier

0 0
原创粉丝点击