PHP MVC原理及实现

时间:2017-07-27
本篇先介绍一下php的MVC实现原理,我们框架的MVC部分也是基于此原理实现的,但是今天的代码并不是框架内的代码,仅仅为说明原理及MVC的实现示例,需要的朋友可以参考一下。

一、mvc原理

  1. mvc是一种程序开发设计模式,它实现了显示模块与功能模块的分离。提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、控制器三层。 
  2. 模型(model)它是应用程序的主体部分,主要包括业务逻辑模块(web项目中的Action,dao类)和数据模块(pojo类)。模型 与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性 
  3. 视图(view) 用户与之交互的界面、在web中视图一般由jsp,html组成 
  4. 控制器(controller)接收来自界面的请求 并交给模型进行处理 在这个过程中控制器不做任何处理只是起到了一个连接的做用 

二、MVC的优点 

  1. 可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。 
  2. 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。 
  3. 模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。 
  4. 潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。 



三、MVC的不足之处 

  1. 增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。 
  2. 视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。 
  3. 视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。 
  4. 目前,一般高级的界面工具或构造器不支持模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成MVC使用的困难。

三、MVC演示示例

为了更好的演示MVC的工作方式,我们使用了一个简单的新闻文章发布系统作为例子。我们只作一个基本的演示,从数据库里读出一些文章列表,并在页面上显示。

model:

<?php      
function get_articles()   
{   
    mysql_connect(…);    
    $result = mysql_query('select * from news order by article_date desc');    
    $articles = array();   
    while ($row = mysql_fetch_objects($result)) {   
        $articles[] = $row;    
    }   
return $articles;   
}   
?>

controller:

<?php   
$articles = get_articles();    
display_template('articles.tpl');   
?>

view:

<html>   
<body>   
<h1>News Articles</h1>   
        <?php foreach ($articles as $row) { ?>   
        <h2><?php echo $row->headline ?></h2>              
            <p>   
                <?php echo $row->body ?>   
            </p>           
        <?php } ?>     
</body>   
</html>

将PHP代码直接写到HTML文件中,感觉不是很专业,也不安全。使用MVC会遇到其他一些问题,比如模板解析、路由转发等,不过这些都是后话了。这里只是简单演示下MVC的一个过程。