资讯专栏INFORMATION COLUMN

自己动手写PHP框架(一)

B0B0 / 2583人阅读

摘要:作者作为的入门进阶,自己动手写一个框架可以从各方面巩固和加深你对的理解,还能了解一些架构方面的基础知识。它将程序划分为三层。最上面的一层,是直接面向最终用户的视图层。最底下的一层,是核心的模型层,负责检索组织和处理程序所需的数据或信息。

作者:Terry Gao

作为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 */

4. 初始化程序
/* Nova/Framework/init.php */
run();

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

5. 核心处理程序
/* Nova/Framework/Core.php */
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 = "NovaApplicationControllers" . $_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架构],与我交流互动。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22555.html

相关文章

  • 自己动手PHP框架(二)

    摘要:作者上一篇提到了类的自动加载和,今天就来逐一说说。为这个问题提供了一个解决方案,这就是类的自动装载机制。为了方便使用自定义的全局,把方法也重写了。 作者:Terry Gao 上一篇提到了类的自动加载和Session,今天就来逐一说说。 1. 类的自动加载 在使用PHP的OO模式开发系统时,通常大家习惯将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也...

    April 评论0 收藏0
  • 自己动手PHP框架(三)

    摘要:假设我们站点的域名是,用户请求地址。模型层我们可以将数据组织和处理逻辑放在模型层,这里封装了数据库操作,甚至有些大型的框架会在这一层对这个数据库进行对象化,目的都是为了组织和处理数据,然后将处理好的数据返回给控制器层。 作者:Terry Gao 1. 控制器 第一篇我们聊到路由分发会把用户请求按照规则分发到控制器层的不同类,而默认的规则中,请求会下发到控制器的index类的main方法...

    Terry_Tai 评论0 收藏0
  • 创建自己的web应用--记账本()

    摘要:前记很早就想为自己写一个东西,但是发现市面上的很多软件其实远远的满足了我的需求,这样一来动手创作的兴致大大降低。说做就做,于是自己开始动手策划应用的前端和后台的各项事宜。 前记 很早就想为自己写一个东西,但是发现市面上的很多软件其实远远的满足了我的需求,这样一来动手创作的兴致大大降低。上周末去大润发买点东西,回来记账的时候发现手机上的记账软件很不舒服,对过往的数据没有可视化的能力,于是...

    YacaToy 评论0 收藏0
  • 从零开始搭建论坛():Web服务器与Web框架

    摘要:服务器通过协议与客户端通信,因此也被称为服务器。本文标题为从零开始搭建论坛一服务器与框架本文链接为更多阅读自己动手开发网络服务器一自己动手开发网络服务器二自己动手开发网络服务器三服务器网关接口实现原理分析最佳实践指南应用浅谈框架编程简介 之前用 Django 做过一个小的站点,感觉Django太过笨重,于是就准备换一个比较轻量级的 Web 框架来玩玩。Web.py 作者已经挂掉,项目好...

    dantezhao 评论0 收藏0
  • 个前端php博客系统--支持markdown哦

    摘要:部署的地址我的博客地址起因最近买了个新的域名,同时在阿里云申请了免费的虚拟主机。。。一个前端写的博客系统前台展示后台登录一个前端写的博客系统文章的修改和删除 部署的地址 我的博客地址:http://www.weber.pub/ 起因 最近买了个新的域名,同时在阿里云申请了免费的虚拟主机。。。借此机会就想搞个自己的博客站点,虽然之前也使用了hexo + github 、 WordPres...

    wenhai.he 评论0 收藏0

发表评论

0条评论

B0B0

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<