MVC框架之从零开始(一)

MVC浅谈

要学习MVC我们要先了解MVC:MVC模式(Model-View-Controller)由Trygve Reenskaug在1974年提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件设计模式。MVC模式的目的是实现一种动态的程式设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。简单来说,MVC模式通过对复杂度的简化,使程序结构更加直观。运用MVC我们就可以更加直观的管理我们的代码;

为什么要自己构建MVC?你自己的心里可能已经有了一个答案,总体来说分为三个方向:①为了更快的开发效率,毕竟自己的东西才是最得心应手的;②为了更高的运行效率,市场上很多框架功能强大,扩展充足,但我很多方面我们都不需要;所以我们要开发出最适合自己的;为自己量身定做的一个框架;③为了拓展自己的知识,构建MVC可以使我们更好的熟悉代码,增加的自己技能;

初步了解MVC流程



通过入口文件->进入文件后定义一些常量->引入需要的函数->自动加载需要的类->就可以启动框架了;

启动以后我们就要运用网址传输所需要的指令数据;->用路由解析->根据解析加载相应控制器->最后返回结果;

入口文件

入口文件是MVC框架所必需的用于更加方便的管理流入数据;怎样构建入口文件?1:定义常量.2:加载数据库;3:启动框架

①定义常量

使用define函数定义;

基本需要的常量有:

1:define('IMOOC',realpath(' ./'));定义文件根目录,已此为目标查找其他文件;

2:define('CORE',IMOOC.'/core');定义框架核心文件目录;

3:define('APP',IMOOC.'/app');定义项目文件目录(比如控制器,模型等)

此外还需要一个变量

define('DEBUG",true);调试模式;默认开启根据判断这个值是否开启调试

if(DEBUG){开启}else{关闭};

在这里我们应用了一个封装功能P;可以更美观的打印值

<?php
function p($var)
{
    if(is_bool($var)) {
        var_dump($var);
    }else if(is_null($var)) {
        var_dump($var);
    }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>";
    }
}


?>

②加载类方法

//加载函数库includeCORE.'/common/function.php';引用此文件CORE就是定义的核心文件目录 使用P()打印输出;

为了更方便的管理我们启动框架需要的类值,我们需要建立一个自动加载类库同样放在核心目录/加载函数库includeCORE.'/imooc.php';引用此文件;

<?php
namespace core; //命名空间
class imooc
{
static public function run() //进入入口文件需要调用的类,因为应用类较多所以用静态方法;
    {
      p('OK');
    }
}
③启动框架

在入口文件调用执行;通过\core\immooc::run();调用;输出OK成功启动框架

加载需要的类

spl_autoload_register('\core\imooc::load');//实例化类不存在则触发此函数;

//自动加载类库
<pre name="code" class="php">public static $classMap=array();//定义一个数组,用于储存缓存
 static public function run()//加载路由类
    {
        p('ok');
           $route= new \core\route();//实验加载路由类
 }

static public function load($class)//$class就是我们需要自动引入的类 { //自动加载类库 //new \core\route();//引入类 //$class = '\core\route';//如果没有引入此类则触发函数 //IMOOC.'/core/route.php';//然后需要转换为此种类型 //p($class); //p(IMOOC.$class.'.php'); if(isset($classMap[$class])){//为了必反重复调用,可以首次调用后存入数组缓存 return true; }else{ $calss=str_replace('\\','/',$class);//使用str_replace将斜杠替换'\'需要用那个'\'转义 $file=IMOOC.'/'.$calss.'.php'; if(is_file($file)){//判断文件是否存在,存在则引用 include $file; self::$classMap[$class]=$class; }else{ return false; } } }

 

<?php
namespace core\lib;
use core\lib\conf;
//路由类
class  route
{
    public function __construct()
    {
p('OK');//随意输出实验是否加载;
    }
}

③输出OK成功;

路由类

简历lib文件存放路由类:

在这里需要用到伪静态;".htaccess";

 <IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php? [QSA,PT,L]
   </IfModule>

设置好以后

<?php
namespace core\lib;
use core\lib\conf;
//路由类
class  route
{
    public function __construct()
    {<span style="font-size:12px;">       </span><span style="color:#808080;background-color:#f7faff;font-style:italic;"><span style="font-size:12px;">
//xxx.com/index.php/index/index/实际访问网址
</span></span><pre name="code" class="php"><span style="color:#808080;background-color:#f7faff;font-style:italic;"><span style="font-size:12px;">
//xxx.com/index/index/地址栏访问网址</span></span>

/*
 *1.隐藏index.php
 *2.获取到URL参数部分
 *3.返回对应的控制器和方法
 */
可以用
$_SERVER['REQUEST_URI']判断值传递
if(isset($_SERVER['REQUEST_URI']) && $_SERVER['REQUEST_URI'] != '/'){
        //index/index
<pre name="code" class="php"><span style="color:#808080;background-color:#f7faff;font-style:italic;"><span style="font-size:12px;"></span></span><pre name="code" class="php">//因为值传递为/id/2/name/2;所以可以先分割为数组再取值
 $path=$_SERVER['REQUEST_URI']; //p($path).'<br>'; $patharr=explode('/',trim($path,'/'));//分割 //p($patharr); if(isset($patharr[0])){ $this->ctrl=$patharr[0]; } unset($patharr[0]); if(isset($patharr[1])){ $this->action=$patharr[1]; unset($patharr[1]); }else{ $this->action = conf::get('ACTION','route'); } //url多余部分转换为GET; //p($patharr); //p($_GET); 
<span style="color:#808080;background-color:#f7faff;font-style:italic;"><span style="font-size:12px;"></span></span><pre name="code" class="php"><pre name="code" class="php"><pre name="code" class="php">//因为值传递为/id/2/name/3;所以需要分割以后获取值;
//获取后为array(
'id'=>2
'name'=>3
)
 
 
 $count=count($patharr)+2;//因为从第三个开始,初始值为0;所以需要加2 $i=2; while($i<$count){ if(isset($patharr[$i+1])) { $_GET[$patharr[$i]] = $patharr[$i + 1]; } $i = $i + 2; } //p($_GET);//最后就可以截取到值了; }else{ $this->ctrl= conf::get('CTRL','route');; $this->action= conf::get('ACTION','route');; }; 
 



 }}

这样我们可以通过解析到的值访问控制器-方法-并传递参数了;

 












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值