现在我们举几个核心框架的例子演示:在framework/core下建立一个Framework.class.php的文件。写入以下代码:

// framework/core/Framework.class.php

class Framework {

publicstatic function run() {

echo"run()";

}

兄弟连教育在这个演示中创建了一个静态方法run(),现在让我们通过入口文件index.php测试一下:

<?php

require"framework/core/Framework.class.php";

Framework::run();

你可以在你的浏览器里访问index.php看到结果。通常这个静态方法被命名为run()或者bootstrap()。在这个方法中,我们要做3件最主要的事情:

class Framework {

publicstatic function run() {

//        echo"run()";

self::init();

self::autoload();

self::dispatch();

}

privatestatic function init() {

}

privatestatic function autoload() {

}

privatestatic function dispatch() {

}

}

初始化

init()方法:

// Initialization

private static function init() {

// Definepath constants

define("DS", DIRECTORY_SEPARATOR);

define("ROOT", getcwd() . DS);

define("APP_PATH", ROOT . 'application' . DS);

define("FRAMEWORK_PATH", ROOT . "framework" . DS);

define("PUBLIC_PATH", ROOT . "public" . DS);

define("CONFIG_PATH", APP_PATH . "config" . DS);

define("CONTROLLER_PATH", APP_PATH . "controllers" .DS);

define("MODEL_PATH", APP_PATH . "models" . DS);

define("VIEW_PATH", APP_PATH . "views" . DS);

define("CORE_PATH", FRAMEWORK_PATH . "core" . DS);

define('DB_PATH', FRAMEWORK_PATH . "database" . DS);

define("LIB_PATH", FRAMEWORK_PATH . "libraries" .DS);

define("HELPER_PATH", FRAMEWORK_PATH . "helpers" .DS);

define("UPLOAD_PATH", PUBLIC_PATH . "uploads" . DS);

// Defineplatform, controller, action, for example:

//index.php?p=admin&c=Goods&a=add

define("PLATFORM", isset($_REQUEST['p']) ? $_REQUEST['p'] :'home');

define("CONTROLLER", isset($_REQUEST['c']) ? $_REQUEST['c'] :'Index');

define("ACTION", isset($_REQUEST['a']) ? $_REQUEST['a'] :'index');

define("CURR_CONTROLLER_PATH", CONTROLLER_PATH . PLATFORM .DS);

define("CURR_VIEW_PATH", VIEW_PATH . PLATFORM . DS);

// Loadcore classes

requireCORE_PATH . "Controller.class.php";

requireCORE_PATH . "Loader.class.php";

requireDB_PATH . "Mysql.class.php";

requireCORE_PATH . "Model.class.php";

// Loadconfiguration file

$GLOBALS['config'] = include CONFIG_PATH . "config.php";

// Startsession

session_start();

}

在注释中你可以看到每一步的目的。

自动加载

在项目中,我们不想在脚本中想使用一个类的时候手动的去include或者require加载,这就是为什么PHP MVC框架都有自动加载的功能。例如,在symfony中,如果你想要加载lib下的类,它将会被自动引入。很神奇是吧?现在让我们在自己的框架中加入自动加载的功能。

这里我们要用的PHP中的自带函数spl_autoload_register:

// Autoloading

private static function autoload(){

spl_autoload_register(array(__CLASS__,'load'));

}

// Define a custom load method

private static function load($classname){

// Heresimply autoload app&rsquo;s controller and model classes

if(substr($classname, -10) == "Controller"){

//Controller

require_once CURR_CONTROLLER_PATH . "$classname.class.php";

} elseif(substr($classname, -5) == "Model"){

//Model

require_once  MODEL_PATH ."$classname.class.php";

}

}

每一个框架都有自己的命名规则,我们的也不例外。对于一个控制器类,它需要被命名成类似xxxController.class.php,对于一个模型类,需要被命名成xxModel.class.php。为什么在使用一个框架的时候你需要遵守它的命名规则呢?自动加载就是一条原因。

路由/分发

// Routing and dispatching

private static function dispatch(){

//Instantiate the controller class and call its action method

$controller_name = CONTROLLER . "Controller";

$action_name = ACTION . "Action";

$controller = new $controller_name;

$controller->$action_name();

}

在这步中,index.php将会分发请求到对应的Controller::Aciton()方法中。

基础Controller类

通常在框架的核心类中都有一个基础的控制器。在symfony中,被称为sfAction;在iOS中,被称为UIViewController。在这里我们命名为Controller,在framework/core下建立Controller.class.php

<?php

// Base Controller

class Controller{

// BaseController has a property called $loader, it is an instance of Loaderclass(introduced later)

protected$loader;

publicfunction __construct(){

$this->loader = new Loader();

}

publicfunction redirect($url,$message,$wait = 0){

if($wait == 0){

header("Location:$url");

} else{

include CURR_VIEW_PATH . "message.html";

}

exit;

}

}

基础控制器有一个变量$loader,它是Loader类的实例化(后面介绍)。准确的说,$this->loader是一个变量指向了被实例化的Load类。在这里我不过多的讨论,但是这的确是一个非常关键的概念。我遇到过一些PHP开发者相信在这个语句之后:

$this->loader = new Loader();

$this->load是一个对象。不,它只是一个引用。这是从Java中开始使用的,在Java之前,在C++和ObjectiveC中被称为指针。引用是个封装的指针类型。比如,在iOS(O-C)中,我们创建了一个对象:

UIButton *btn = [UIButton alloc] init];

加载类

在framework.class.php中,我们已经封装好了应用的控制器和模型的自动加载。但是如何自动加载在framework目录中的类呢?现在我们可以新建一个Loader类,它会加载framework目录中的类和函数。当我们加载framework类时,只需要调用这个Loader类中的方法即可。

class Loader{

// Loadlibrary classes

publicfunction library($lib){

include LIB_PATH . "$lib.class.php";

}

// loaderhelper functions. Naming conversion is xxx_helper.php;

publicfunction helper($helper){

include HELPER_PATH . "{$helper}_helper.php";

}

}

转载于:https://www.cnblogs.com/xdlltao/p/5969646.html

PHP MVC框架核心类相关推荐

  1. 自己动手写一个简单的MVC框架(第二版)

    一.ASP.NET MVC核心机制回顾 在ASP.NET MVC中,最核心的当属"路由系统",而路由系统的核心则源于一个强大的System.Web.Routing.dll组件. 在 ...

  2. PHP: 手把手编写自己的 MVC 框架实例教程

    1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...

  3. php mysql mvc_PHP MVC框架【Myphp】的编写

    1.什么是MVC MVC(Model-View-Controller)是软件工程的一种软件架构模式. 在MVC模式设计下,软件系统被分来三个模块:模型(Model).视图(VIew).控制器(Cont ...

  4. 2022/5/3 Spring MVC框架

    目录 1丶什么是MVC 1.1丶回顾MVC 1.2丶MVC设计模式 1.3丶SpringMVC架构 1.4丶概述 1.5丶中心控制器(DispatcherServlet) 1.6丶SpringMVC执 ...

  5. java mvc框架有哪些_常用的MVC框架有哪些

    展开全部 常用的MVC框架有JSP + servlet + javabean的模式e69da5e887aa3231313335323631343130323136353331333431373232. ...

  6. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)(转)

    阅读目录 一.MVC原理解析 1.MVC原理 二.HttpHandler 1.HttpHandler.IHttpHandler.MvcHandler的说明 2.IHttpHandler解析 3.Mvc ...

  7. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)

    前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...

  8. php ci 框架 扩展缓存类,CodeIgniter扩展核心类实例详解

    本文实例讲述了CodeIgniter扩展核心类的方法.分享给大家供大家参考,具体如下: CI中对核心类.辅助类和函数的扩展是相当方便的,配置文件中指定了subclass_prefix扩展前缀,默认为M ...

  9. 自定义MVC框架之工具类-图像处理类

    截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( ...

最新文章

  1. mybatis逆向工程配置文件怎么再偷懒(懒出天际)
  2. 谷歌工程师:聊一聊深度学习的weight initialization
  3. 08 - JavaSE之IO流
  4. js中的(function(){...})()
  5. 使用 greenDao 框架 操作数据库
  6. CString 操作函数
  7. 3级调度 fpga_FPGA的软核、硬核、固核
  8. 马踏棋盘python_马踏棋盘python实现
  9. C源程序括号匹配检查(C语言)
  10. DDOS防御流量清洗的解决方案,流量清洗服务有什么功能?
  11. VNC 实现 Windows 远程访问 Ubuntu 16.04(无需安装第三方桌面,直接使用自带远程工具)
  12. 什么是 DNS,有什么作用?为什么需要更换公共DNS服务器?
  13. 毕业设计中使用支付宝沙箱完成在线支付流程
  14. ECShop 替换手机版购物首页(2)
  15. 学习springboot第一天
  16. 如何评价电影《西游记之大圣归来》?
  17. 与日俱进,在 Go 1.20 中这种高效转换的方式又变了
  18. 前端牛客网刷题总结【 JS基础变量、数据类型、数据类型转换、运算符等】
  19. 华山全敏还是全劲_一梦江湖华山加点_一梦江湖华山加点推荐2020_攻略
  20. The Shawshank Redemption-20

热门文章

  1. python写入文件后换行_python向文件写入行避免fi末尾的换行
  2. 进阶学习(3.7) Flyweight Pattern 享元模式
  3. 武汉网络推广教大家如何编辑出更高质量的文章TDK?
  4. 浅析如何让网站建设更具新颖?
  5. 电脑换ip软件_为什么会有企业需要软件换IP?
  6. android 高德定位 区域,区域定位-行政区划浏览-示例中心-JS API UI 组件示例 | 高德地图API...
  7. 在Linux下gcc缺省编译,在Linux下GCC将文件合起来编译
  8. SIMD指令集——一条指令操作多个数,SSE,AVX都是,例如:乘累加,Shuffle等
  9. VAE--就是AutoEncoder的编码输出服从正态分布
  10. 迁移学习算法之TrAdaBoost ——本质上是在用不同分布的训练数据,训练出一个分类器...