温馨提示: 请在Chrome、Firefox等现代浏览器浏览本站。

php实现的MVC模式框架-「布尔」

php技术 admin 评论

php实现的MVC模式框架 在PHP学习和使用中,用的最多的就是mvc框架了,市情上多半的mvc框架对付微小型的网站来讲都过于臃肿,于是我就萌发了自己写一个小型框架的设法主意.用于自己的b

php实现的MVC模式框架-「布尔」

php实现的MVC模式框架

在PHP学习和使用中,用的最多的就是mvc框架了,市情上多半的mvc框架对付微小型的网站来讲都过于臃肿,于是我就萌发了自己写一个小型框架的设法主意.用于自己的blog.

简述MVC

MVC在软件工程中是一种软件的架构。从php的角度来说MVC有一些不同。

Model(模型),程序应用功能的实现,程序的逻辑的实现。在PHP中负责数据管理,数据生成。

View(视图),图形界面逻辑。在PHP中负责输出,处理如何挪用模板、需要的资源文件。

Controller(节制器),负责转发请求,对请求处理。在PHP中凭据请求决意挪用的视图及使用的数据。

为甚么要使用MCV

MVC的主要作用是为了将代码分层、分类。

MVC的主要目的是为了解决Web开发中分散开发与设计工作,使其工作相对自力。

在这样的历程中还发现了其他的一些优点,网站的目录结构越发清晰,网站更容易维护与扩大,可以实现模块的复用。

MVC实现

请求url

首先,约定请求页面时的URL,以以下结构进行实现:

localhost/index.php?c=demo&a=index?m=welcome

如果想获得越发优美的URL结构,可以进行优化,为由这URL结构优化与本文关系不大,以落后行分享。

从上面的参数可以看出,接见的文件是index.php,同时含有3个参数离别为c、a、param

MVC目录结构

接着,计划MVC的目录结构以下:

php实现的MVC模式框架-「布尔」

节制器controller

将以下代码添加到controller/democontroller.php文件中。

// controller/democontroller.php class DemoController { public function index() { echo 'hello world'; } }// End of the class DemoController// End of file democontroller.php

在这个文件中仅仅定义了一个DemoController的类,且其只包含一个index要领,用于输出hello world。

将下面代码添加到进口文件index.php文件中。

//index.php require('controller/democontroller.php'); $controller = new DemoController(); $controller->index(); // End of index.php

在浏览器中使用上面的约定的URL进行接见,看到输出hello world。当然如果你请求的URL不是那样,而是以下面所示也能获得同样的输出。

127.0.0.1/index.php?c=abc

发现URL中的参数还没有任何作用。

如果使用下面的URL进行接见,可以预感不会有任何输出。

127.0.0.1/controller/democontroller.php

可以看到要想接见这个网站并获得正确的结果,目前只能通过index.php来接见,这也是为甚么称它为进口文件的原因。现在无论参数如何只能接见同样一个页面,那末如何来决意显示不同的结果呢?或者挪用不同的节制器呢?

革新进口文件

下面利用URL中的参数来决意使用哪一个节制器。

//index.php // get runtime controller prefix $c_str = $_GET['c']; // the full name of controller $c_name = $c_str.'controller'; // the path of controller $c_path = 'controller/'.$c_name.'.php'; // get runtime action $method = $_GET['a']; // load controller file require($c_path); // instantiate controller $controller = new $c_name; // run the controller method $controller->$method(); // End of index.php

同样在浏览器中使用上面的约定的URL进行接见,看到输出hello world。代码中的注释已经说明了每步的目的。当然可以通过改变URL参数中的c与a值来挪用不同的controller及其要领,以输出不同的结果。

视图View

前面只是使用了节制器controller,同时在进口文件index.php中实现了动态挪用不同的节制器。接着加入视图将显示分散。

 // view/index.php class Index { public function display($output) { // ob_start(); echo $output; } } // End of index.php

视图目录中的index.php文件中定义了Index要领,且只有一个display()函数,负责将传递给它的变量进行输出。

下面修改节制器文件。

// controller/democontroller.php class DemoController { private $data = 'Hello furzoom!'; public function index() { //echo 'hello world'; require('view/index.php'); $view = new Index(); $view->display($data); } }// End of the class DemoController// End of file democontroller.php

在节制器中定义了一个data私有变量,index()要领不再直接输出,而是使用视图工具处理输出。此时,按上面的约定的URL进行接见时,将看到输出:

Hello laowang!

可以凭据不同的请求挪用不同的视图类,以不同的形式显示数据。这样就将增加了视图的作用,设计人员可以只针对视图进行页面的设计。

模型Model

上面貌似已经很cool了,然则显示甚么样的内容是在节制器中直接指定的,希望内容也由URL指定,这样将数据的处理交给模型来处理。

// model/model.php class Model { private $data = array( 'title' => 'Hello furzoom', 'welcome' => 'Welcome to furzoom.com', ); public function getData($key) { return $this->data[$key]; } }// End of model.php

视图文件model.php定义了一个Model类,类中定义了一个getData()的要领,用于返回请求的数据。

同时修改进口文件index.php以下:

 //index.php // get runtime controller prefix $c_str = $_GET['c']; // the full name of controller $c_name = $c_str.'controller'; // the path of controller $c_path = 'controller/'.$c_name.'.php'; // get runtime action $method = $_GET['a']; // get runtime parameter $param = $_GET['param']; // load controller file require($c_path); // instantiate controller $controller = new $c_name; // run the controller method $controller->$method($param); // End of index.php

增加了一个参数$param,将其作为节制器的要领挪用参数。

还需要修改节制器的要领凭据不同参数获得不同的数据。

// controller/democontroller.php class DemoController { // private $data = 'Hello gblw.me'; function index($param) { // echo 'hello world'; require('view/index.php'); require('model/model.php'); $model = new Model(); $view = new Index(); $data = $model->getData($param); $view->display($data); } }// End of the class DemoController// End of file democontroller.php

包含需要的视图文件和模型文件,然后生成视图与模型文件,接着通过模型工具获得数据,再用视图工具来输出获得的数据。

此时,在浏览器中使用上面的约定的URL进行接见,将获得输出以下:

Welcome to gblw.me

至此PHP的MVC模式已经基本介绍完成了,残剩的工作就是凭据需要进行添加扩充了,很简单吧!!

功能强大但很少有人用的函数

有一些函数,我们平时很少有人用,但其实不否定它们很强大.目前市情上的函数足够多,加上彀友自己写的.其实不在少数.有些函数被轻忽了.

create_function — 建立一个函数

func_get_arg — 获得函数中某个参数的值

func_get_args — 获得函数的所有参数并组成数组

func_num_args — 获得一个函数的参数个数

function_exists — 判定一个函数是不是存在

get_defined_functions — 获得已有的函数信息

register_shutdown_function — 注册一个页面载入完成后运行的函数

register_tick_function — 注册一个按要求挪用的函数

unregister_tick_function — 作废一个按要求挪用的函数

create_function函数可以建立一个匿名的函数(函数名被PHP默许为lambda_1,lambda_2),样子比较离奇,然则形式比较奇特,要注意第二个参数内的语句要有“;”分隔

$newfunc = create_function('$a,$b', 'return $a + $b;');echo $newfunc;echo $newfunc(2, 3);//显示 lambda_1 5

func_get_arg函数可以获得某一个传递过来参数的值,在下面的例子中,在函数中并没有具体说明有哪些参数会被接受,利用func_get_arg还可以获得分外的参数:

function a(){ echo func_get_arg(1);}a (111, 222, 333);//显示 222

func_get_args函数的作用和func_get_arg异常相似,是把所有的参数当做数组来挪用:

function a(){ $numargs = func_num_args(); $b = func_get_args(); for ($i = 0; $i < $numargs; $i++) { echo $b[$i]; }}a(111, 222, 333);//显示 111 222 333

get_defined_functions可以获得所有的PHP函数和自定义的函数:

function a(){}$b = get_defined_functions();print_r($b);//也许会显示1000多个已定义了的函数:)

register_shutdown_function函数可以注册一个在页面载入完成之后运行的函数(功能有点像缓存),register_shutdown_function也可以像call_user_func函数一样用作对类内部要领的挪用:

function a(){ $numargs = func_num_args(); $b = func_get_args(); for ($i = 0; $i < $numargs; $i++) { echo $b[$i]; }}a(111, 222, 333);//显示 111 222 333

get_defined_functions可以获得所有的PHP函数和自定义的函数:

function a(){}$b = get_defined_functions();print_r($b);//也许会显示1000多个已定义了的函数:)

register_shutdown_function函数可以注册一个在页面载入完成之后运行的函数(功能有点像缓存),register_shutdown_function也可以像call_user_func函数一样用作对类内部要领的挪用:

function a() { echo 222 ;}echo 111;register_shutdown_function('a');//显示 111 222class a{ function b ($c) { echo $c; }}register_shutdown_function (array ('a', 'b'), '111');//显示 111

register_tick_function函数和unregister_tick_function函数必需要和declare流程节制机制合并使用,那末就先了解一下declare和tick:

declare (directive){statement}

Tick 是一个在 declare 代码段中解释器每执行 N 条初级语句就会产生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 来指定的。在每一个 tick 中泛起的事件是由 register_tick_function() 来指定的。举例以下:

function foo($str) {static $i = 0;print "$str: $i";$i++;}register_tick_function("foo", "count");declare (ticks = 6) {for($i=0; $i<20; $i++) {echo "$i";}}

在这个例子中的declare(ticks = N){statement}流程节制里面,每执行6行(ticks = 6)代码,就需要运行一次foo()函数,通过变动ticks的值,我们可以获得不同的运行结果。



发表我的评论
取消评论

表情

您的回复是我们的动力!

  • 昵称 (必填)
  • 验证码 点击我更换图片
  • 网友最新评论