首页 » PHP教程 » php视图模板ob技巧_php实现的MVC模式框架布尔

php视图模板ob技巧_php实现的MVC模式框架布尔

访客 2024-12-17 0

扫一扫用手机浏览

文章目录 [+]

php实现的MVC模式框架

在PHP学习和利用中,用的最多的便是mvc框架了,市情上多数的mvc框架对付眇小型的网站来说都过于臃肿,于是我就萌生了自己写一个小型框架的想法.用于自己的blog.

php视图模板ob技巧_php实现的MVC模式框架布尔

简述MVC

php视图模板ob技巧_php实现的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的目录构造如下:

掌握器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的值,我们可以得到不同的运行结果。

相关文章