框架流程

** 实际上框架的目的就是为了让前后端分离,代码更清晰,便于维护,各干各的事情.一目了然.**

  • 新建框架根目录 dream
  • 在根目录下建立单一入口文件 index.php
<?php
define('DREAM', __DIR__);//定义根目录常量  
define('APP', DREAM .'/App/');//定义应用目录   
define('CORE' , DREAM ,'/Core/');//定义核心文件目录 
define('DEBUG' , true);//定义调试模式 
//判断是否开启调试
if(DEBUG){
  ini_set('display_errors' , 'On');
}else{
    ini_set('display_errors' , 'Off');
}
//引入公共函数类库
require CORE . 'Common/function.php';
//引入框架核心文件
require CORE . 'dream.php';
//注册自动加载类
spl_autoload_register('\Core\dream::_autoload');
//启动框架
Core\dream::run();
  • 在根目录新建 App文件夹 和 Core文件夹
  • 在Core文件夹下新建 Common文件夹
  • 在Common 文件夹下 新建 function.php
<?php
配置公共方法
function p($var) //打印函数
{
    if (is_bool($var)) {
        var_dump($var);
    } elseif (is_null($var)) {
        var_dump(null);
    } else {
        echo "<pre style='position: relative;z-index: 1000;padding: 10px;border-radius: 5px;background: #F5F5F5;border: 1px solid #aaa;font-size: 14px;line-height: 18px;opacity:0.9;'>" . print_r($var, true) . "</pre>";
    }
}
  • 在Core 文件 下 新建框架核心文件 dream.php
<?php
namespace Core;//定义命名空间
class dream
{
static public $classFile = [];
//框架启动方法
  static public function run()
  {
    
  }
//自动加载类 当我们new 一个不存在的类 时 自动调用该方法
 static public function _autoload($class)
  {
    //先处理 类名 的反斜线为正斜线
    $class = str_replace('\\', '/', $class);
    //然后再拼接文件路劲
    $file = DREAM . '/' . $class . '.php';
    //判断文件是否存在
      if(isset($classFile[$class])){
         return true;
      } else {
        require $file;
        $classFile[$class] = $class;
      }
}
  • 在Core文件 下 新建路由文件 route.php
<?php
namespace Core;
class route
{
  public $ctrl;
  public $action;
  public function __construct()
  {
    //判断路劲是否存在 且 路劲不能等于 '/'
    if(isset($_SERVER['REQUEST_URL']) && $_SERVER['REQUEST_URL'] != '/'){
        //接收并处理路径
        $path = $_SERVER['REQUEST_URL'];
        //去除两边的'/',并分割
        $patharr = explode('/', trim($path, '/'));
        //如果存在下标为 0  的就存储为控制器名
        if(isset($patharr[0])){
          $this->ctrl = $patharr[0];
        }
        //释放 为后面截取参数做准备
        unset($patharr[0]);
        //下标为 1 的如果存在就存储为方法名 并释放 否则就默认为index操作
        if(isset($patharr[1])){
          $this->action = $patharr[1];
          unset($patharr[1]);
        } else {
          $this->action = 'index';
        }
        //统计$patharr 的数量
        $count = count($patharr) + 2;
        $i = 2;
        while($i < $count){
           //判断传的参数是否都存在 然后获取参数 否则不做动作
            if(isset($patharr[$i] + 1)){
                $_GET[$patharr[$i]] = $patharr[$i + 1];
            }
            $i = $i +2;
        }
        
      } else {
        $this->action = 'index';
        $this->ctrl = 'index';
      }
  } 
}

然后再 dream.php 核心文件中加载 控制和方法

<?php
namespace Core;
class keep
{
    static public $classMap = [];
    public $assign;
     static public function run()
    {
        $route =new \Core\route();
        $ctrlClass = ucfirst($route->ctrl);
        $action = $route->action;
        $ctrlFile = APP.'Controller/'.$ctrlClass.'Controller.class.php';
        $ctrlClass = '\\'.MODULE.'\\Controller\\'.$ctrlClass.'Controller';
        if (is_file($ctrlFile)) {
            require $ctrlFile;
            $ctrl = new $ctrlClass;
            $ctrl->$action();
        } else {
            throw new \Exception('找不到控制器',$ctrlClass);
        }
    }

    static public function _autoload($class)
    {
        $class = str_replace('\\','/',$class);
        $file = KEEP.'/'.$class.'.php';
        if (isset(self::$classMap[$class])) {
            return true;
        }else{
            if (is_file($file)) {
                require $file;
                self::$classMap[$class] = $class;
            }else{
                return false;
            }
        }
    }
    //将控制器里发送的数据 接收 并存储
    public function assign($name,$value)
    {
        $this->assign[$name] = $value;
    }
    //加载模板文件
    public function display($file)
    {
        //对接收到了文件名 拼接处理
        $file = APP.'View/'.$file;
        //如果存在 就引入
        if (is_file($file)) {
          //这里extract 是php 的一个函数 作用是将 数据打散 在模板使用
            extract($this->assign);
            require $file;
        }
    }
}
  • 并在App 文件夹下 新建 Controller 文件夹.
  • 在Controller 文件夹下 新建IndexController.class.php //这里为了防止命名冲突导致加载错误 所以名称这样建
  • 在Core 文件夹下 新建 Lib 文件夹 在建立 model.php//连接数据库
<?php
namespace Core\Lib;
class model extends \PDO //继承PDO
{
    public function __construct()
    {
        $dsn = 'mysql:host=localhost;dbname=test';//主机名 和库名
        $username = 'root';//用户名
        $passwd = 'root';//密码
        try {
            parent::__construct($dsn, $username, $passwd);
        } catch (\PDOException $e) {
            p($e->getMessage());//失败抛出异常
        }
    }
}
  • 在Controller 下的IndexController.class.php 文件 进行数据 发送模板 加载模板
  • $this->assign 方法 和$this->display 方法 在核心文件 dream.php 中定义
<?php
namespace App\Controller;
use Core\Lib\model;
class IndexController extends \Core\keep
{
    public function index()
    {
        $model = new \Core\Lib\model();
        $sql = "SELECT * from qiduo_market";
        $res = $model->query($sql);
        $data = $res->fetchAll();
//        $data = 'Hello Wrold';
        $this->assign('data',$data);
        $this->display('index.html');

    }
}

** 一套流程就是这样的,框架的作用是为了提高重用性,可维护性和便捷的操作.但是由于框架众多,功能齐全,但是自己又用不到那么多,占用资源.所以有必要试试做一个自己的框架. **

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容