php框架单一入口和多入口,PHP框架如何 实现MVC模式以及单一入口

PHP框架如何

实现MVC模式以及单一入口

2009-12-1 11:42:01   出处:https://www.yqdown.com

关于MVC

这里不细致

讲解何为MVC模式,只是基本

介绍,关于MVC的具体信息可以去网络上找寻,MVC模式在我理解来它将一个项目分解成三部分,分别是Model(模型),View(视图),Controller(控制器),这三个单词的缩写组合即为MVC.MVC是一种普遍的软件敏捷开发模式,在许多领域特别是桌面编程领域早已经得到了广泛的使用

,然而在像php一样的脚本语言中比较难以实现,特别是几年前在脚本语言中很难看到MVC的实现,但是今年随着众多框架的涌现,MVC在各个框架中得到了初步实现,其他框架中的实现方式暂且不提,这里只是介绍codeigniter是如何

实现MVC的.

关于单一入口

单一入口指在一个站点

(使用

程序)中,所有的请求都是指向一个脚本文件的,例如CI中的http:\\localhost\index.php,所有对使用

程序的访问都是必须通过这个入口,正是单一入口才使得MVC模式得以实现,因为当你访问index.php的时候,使用

程序会做大量的原始

化工作,调用大量的基础类库,并根据index.php后面的参数加载控制器,然后加载试图,模型等内容信息.

ci的所有文件加载都要经过控制器调用,因为控制器是CI中的超类,也就是其他的类都依附于它,所以用单一入口方式访问CI使用

程序的时候,须要

在index.php的后面加上控制器名和控制器中的要领

名,如果你对于此没有任何概念或者不能

理解,可以去CI的官方站点

下载它的官方文档,然后细致

了解它的工作方式

CI的官方文档非常详尽易懂,这里描述的是文档上所不存在的基本原理部分.

开始

或许应该先讲解CI的控制器是如何

工作的,CI中的一个控制器就是用户编写的一个类,它继承自系统的Controller类,例如假设我们要构建一个可以通过http:\\localhost\index.php\control\func\param1\param2访问的页面,我们须要

做哪些工作呢,首先我们要在system\application\controllers\文件夹下新建一个文件contro.php文件,这个文件即是我们要访问的控制器类所在文件,在此文件中建立

以下内容:

1 class Controller extends Controller {2 3     function Controller()4     {5         parent::Controller();    6     }7     8     function func($param1,$param2)9     {10   $this->load->model('MSomemodel','',TRUE);11   $data['data1']= $this->MSomemodel->getvalue();12            $this->load->view('welcome',$data);13     }14 }15

这并不是一个控制器的基本组成部分,而是包含了model和view的一个控制器例子,

首先留心

控制器的类名应该是首字母大写的,然后在类的构造函数里应该调用父类的构造函数,之后则是func()要领

,也就是url后面所带参数的第二个部分,这个要领

带有两个参数,这两个参数的值就是url的第三部分和第四部分的值,也就是单一入口的访问方式实际是:http:\\localhost\index.php\控制器名\要领

名\要领

的参数1\要领

的参数2\......

在控制器类中每个要领

代表一个页面,也就是可以将很多类似的操作放到一个控制器中,实现对操作的统一

在上述的例子中的func()要领

中的其他部分分别加载了model和view,加载model的时候加载的是在models文件夹中的msomemodel.php文件中的MSomemodel类,这个类负责使用

程序的模型部分,也就是负责数据的交换,例如数据库的存储.

然后我们通过$data= $this->MSomemodel->getvalue()执行了model中的一个要领

,并从这个要领

返回了数据,然后赋值给$data['data1'],$data是一个关联数组,我们通过这个数组向view视图文件传值,而不是运用

多见

的模板模式,这种要领

更好地分离了MVC各个部分的处理,同时在性能方面有其独特的一面.

之后我们通过将$data数组传给views文件夹中的welcome.php文件,这个文件是常规的php和html混写的脚本,在这个脚本中可以运用

传过来的$data数组输出信息,但是留心

在view文件中输出信息的时候不必运用

$data['data1'],而只须要

echo $data1;即可.

基本的工作方式就是这样的,下面从代码级别来分析实现

代码分析

在CI中将Controller类作为超类来处理,也就是所有加载MVC实现模式的进程都从Controller类开始,所以我们忽略CI在加载到这个类的时刻前面的执行流程

,而直接从Controller类所在的文件开始分析.

Controller类所在的文件位于system/libraries/Controller.php文件中.

在这个类中首先加载了所有必须的基础类,包括:'Config','Input', 'Benchmark', 'URI', 'Output', 'Language', 'Router'类.之后加载Roader类并执行了它的 _ci_autoloader()要领

,这个类是MVC模式的核心,控制器中所有其他内容的加载都是通过它实现的,下面对其代码执行

分析:

首先来看 _ci_autoloader()要领

,这个函数实现了自动加载某些类库或者类,如果在你的使用

程序中总是要用到某些类,但是你又不确保在CI中能不能

已经自动加载了这些类的话,你可以在config/autoload.php文件中设定要自动加载的library或者helper或者plugin的数组.具体请参考手册.

首先看看CI是如何

加载libraries的,这个要领

允许你在你的控制器的任何地点

(通常是构造函数里)运用

$this->load->library("name");来加载某个类,这个类可以是用户自定义的类也可以是系统的类库,用户自定义的类须要

遵循CI的约定,具体信息见手册中的"建立

你自己的类库 "部分.library()要领

以一个字符串或者一个类库名称的数组作为第一个参数,之后的处理将遍历然后加载所有的类,你可以通过第二个参数向要加载的类的构造函数传递参数,第三个参数允许你定义返回的对象的名称,后面的两个参数通常不运用

,这个要领

在基本

判断了参数能不能

为空之后调用了要领

_ci_load_class($class, $params = NULL, $object_name = NULL),这是一个非常复杂的函数,这个类加载第一个参数所指定的类,在这个类中执行

了复杂的路径判断之后找到了所须要

的类文件之后,调用了要领

_ci_init_class($class, '', $params, $object_name);这个类用来实例化一个类,如果在加载这个类的语句中包含了上述的第三个参数,则返回一个实例,以这个参数作为实例名,如果没有配置

第三个参数,则返回一个以类名命名的实例名,这也是为什么前面的例子中在加载了model之后,直接将model类名作为一个对象运用

的原由

.

之后我们来看CI是如何

加载模型的,这个要领

允许你在控制器中运用

$this->load->model($modelname,$name,$db_conn)加载模型,这三个参数分别是加载的模型的名称,加载后实例化的对象名称,能不能

自动连接数据库.后面两个参数可以省略,你可以讲多个模型一次载入,只须要

将第一个参数配置

成数组即可,这个要领

首先将传过来的第一个参数以"\"分解成数组,这种机制允许你在模型中建立

多层文件夹,更加合理地安排代码的分组,之后程序取出数组的最后一个元素作为要加载的类的名称,并根据路径寻找此类,之后包含此文件,并实例化此类,如果配置

了第二个参数,则实例化到$name的对象中,否则默认以类名作为对象名执行

实例化.

再来看CI是如何

加载视图的,view($view, $vars = array(), $return = FALSE)要领

的第一个参数是要加载的视图名称,第二个参数是要传给视图的变量值,第三个参数指定能不能

返回输出缓冲区的数据.这个要领

将所有数组作为一个数组参数调用了_ci_load($_ci_data)要领

,这个要领

将传过来的变量数组通过extract()函数分析

成符号表(也就是将键名当作变量名,值作为变量的值),并将这些变量缓存起来,以便可以再不同的视图中能够互相交流变量,也就是这个要领

允许调用多次,为了在每次调用时都能自动加载已经传给前面视图的变量,将所有传给视图的变量都缓存在类的一个属性中,这样每次调用要领

的时候都会获取所有的变量.之后加载这个视图文件,然后将其作为输出缓冲的一部分赋给全局变量$OUT,这个变量用来控制缓冲输出,这样做可以提高效率以及可以使调试的时间更准确.

其他的加载要领

和上述的要领

原理基本相同,只是根据情况有少许改动

,CI在实现MVC模式的要领

中将所有的文件都包含在控制器中,我们在包含了这些文件后,可以再控制器中自由运用

这些对象和数据,然后最后通过缓冲输出类来输出所有的数据,虽然Loader这个类的结构看起来很复杂,但是其实它的实现时很基本

的,其内部的代码原理基本相同,而且清晰明了,仔细看的话不难理解.

分享到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的 PHP MVC 框架实例: 1. 创建一个 index.php 文件,作为入口文件,内容如下: ``` <?php // 加载配置文件和自动加载类 require_once 'config.php'; require_once 'autoload.php'; // 实例化路由类,解析 URL $router = new Router(); $router->parseUrl(); // 根据解析后的控制器和方法,实例化控制器并调用方法 $controllerName = $router->getControllerName(); $methodName = $router->getMethodName(); $controller = new $controllerName(); $controller->$methodName(); ``` 2. 创建一个 config.php 文件,用来定义数据库连接等常量,内容如下: ``` <?php define('DB_HOST', 'localhost'); define('DB_NAME', 'test'); define('DB_USER', 'root'); define('DB_PASS', 'password'); ``` 3. 创建一个 autoload.php 文件,用来自动加载类文件,内容如下: ``` <?php spl_autoload_register(function ($classname) { $filename = strtolower($classname) . '.php'; if (file_exists($filename)) { require_once $filename; } }); ``` 4. 创建一个 Router 类,用来解析 URL,内容如下: ``` <?php class Router { private $controllerName; private $methodName; private $params = array(); public function parseUrl() { if (isset($_GET['url'])) { $url = $_GET['url']; $url = rtrim($url, '/'); $url = filter_var($url, FILTER_SANITIZE_URL); $url = explode('/', $url); $this->controllerName = ucfirst($url[0]) . 'Controller'; $this->methodName = isset($url[1]) ? $url[1] : 'index'; array_shift($url); array_shift($url); $this->params = $url; } else { $this->controllerName = 'HomeController'; $this->methodName = 'index'; } } public function getControllerName() { return $this->controllerName; } public function getMethodName() { return $this->methodName; } public function getParams() { return $this->params; } } ``` 5. 创建一个 BaseController 类,作为所有控制器的父类,内容如下: ``` <?php class BaseController { protected function loadModel($model) { require_once 'models/' . $model . '.php'; return new $model(); } protected function view($view, $data = array()) { require_once 'views/' . $view . '.php'; } protected function redirect($url) { header('Location: ' . $url); exit; } } ``` 6. 创建一个 HomeController 类,作为默认控制器,内容如下: ``` <?php class HomeController extends BaseController { public function index() { $this->view('home/index'); } } ``` 7. 创建一个 models 目录和一个 views 目录,用来存放模型和视图文件。 以上就是一个简单的 PHP MVC 框架实例。可以根据需要添加更多的控制器、模型和视图文件,以及实现更多的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值