0x01 mvc的概念与作用
MVC是一种非常重要的设计模式,是三个字词的缩写,分别为:模型,视图,控制器,mvc模式的目的是实现web系统的职能分工,它强制性使应用程序的输入,处理和输出分开,可以各自处理自己的任务,是一种分层的概念,module层实现系统中的业务逻辑,view层用于实现与用户的交互,controller层是model与view之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图用于显示,同时它也可以解释用户的输入并将他们映射为模型层可执行的操作
mvc的设计思路是把一个应用的输入,处理,输出流程按照model,view和controller的方式进行分离,这样一个应用被分为三个层(模型,视图,控制)
0x02 mvc的优点
1.各施其职,互不干涉
在MVC模式中,三个层各施其职,所以如果一旦哪一层的需求发生了变zhi化,就只需要更改相应的层中的代码而不会影响到其它层中的代码。
2.有利于开发中的分工
在MVC模式中,由于按层把系统分开,那么就能更好的实现开发中的分工。网页设计人员可以进行开发视图层中的JSP,对业务熟悉的开发人员可开发业务层,而其它开发人员可开发控制层。
3.有利于组件的重用
分层后更有利于组件的重用。如控制层可独立成一个能用的组件,视图层也可做成通用的操作界面。
4.MVC设计模式可以说实现了分层开发。各个层都有各个层的作用。
5.降低了层与层之间的依赖,有利于代码的标准化开发
6.再用新的代码业务逻辑替换时,只需要替换相对应的层,大大降低了我们的工作量,分工明确。
0x02 mvc的缺点
1.增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
2.视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
3.视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
4.目前,一般高级的界面工具或构造器不支持MVC模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成使用MVC的困难。
5.麻烦,有些代码重复的过多,不利于在实际开发中使用,所以我们要学习框架,下面的鸟瞰图分析了框架在MVC里都替代了哪些层。
0x03 mvc
这里我们就需要分离开来
Index/Controller/IndexController.php
<?php
class IndexController{
public function index(){
echo 1;
}
}
?>
Index/Controller/IndexController.php
<?php
class IndexController{
public function index(){
echo 1;
}
public function test(){
echo 2;
}
}
?>
index.php
<?php
$c = isset($_GET['c']) ? $_GET['c']."Controller" : 'IndexController';
$m = isset($_GET['m']) ? $_GET['m'] : "index";
$root_file = dirname(__FILE__)."/Index/Controller/";
if(!file_exists($root_file.$c.".php")){
echo "错误异常";die;
}
include_once $root_file.$c.".php";
$info = new $c;
$info->$m();
?>
这里来写个mvc的登录框架
index.php
<?php
$c = isset($_GET['c']) ? $_GET['c']."Controller" : 'IndexController';
$m = isset($_GET['m']) ? $_GET['m'] : 'index';
$root_file = dirname(__FILE__)."/Index/Controller/";
if(!file_exists($root_file.$c.".php")){
echo "错误异常";die;
}
include_once $root_file.$c.".php";
$info = new $c;
$info->$m();
/Controller/IndexController.php
<?php
class IndexController
{
public function index()
{
if($_POST){
include_once dirname(dirname(__FILE__))."/Model/IndexModel.php";
$info = new IndexModel();
$data = $info->index($_POST['username'],$_POST['password']);
if($data){
echo 1;
} else {
echo 2;
}
} else {
include_once dirname(dirname(__FILE__))."/View/Index/index.tpl";
}
}
}
/Module/IndexModel.php
<?php
/**
*
*/
class IndexModel
{
public function index($name = "",$password = "")
{
if($name == "admin"){
return true;
} else {
return false;
}
}
}