php mvc 初级
MVC (模型-视图-控制器)
- MVC是一种编程思想,既模型-视图-控制器,将业务逻辑、数据、显示界面分隔开的一种模式。
- 假如你想写一段代码,功能是从数据库取出数据,并到前端显示出来,最原始是这样写的:
<?php
// index.php
$link = mysql_connect('localhost', 'dbuser', 'dbpassword');
mysql_select_db('blog', $link);
$result = mysql_query('SELECT id, title FROM post', $link);
?>
<!DOCTYPE html>
<html>
<head>
<title>文章列表</title>
</head>
<body>
<h1>文章列表</h1>
<ul>
<?php while ($row = mysql_fetch_assoc($result)): ?>
<li>
<a href="/show.php?id=<?php echo $row['id'] ?>">
<?php echo $row['title'] ?>
</a>
</li>
<?php endwhile; ?>
</ul>
</body>
</html>
<?php
mysql_close($link);
?>
以上代码建议使用mysqli或者pdo方法。
这样一个页面将所有的操作做完,但是维护起来很麻烦,尤其是扩展性十分低。
抽离表现层
- 接下来你可能注意到这些问题,于是你决定抽离表现层,将html页面单独放在一个页面,然后由“主逻辑”页面引用她,效果与刚才一样:
<?php
// index.php
$link = mysql_connect('localhost', 'dbuser', 'dbpassword');
mysql_select_db('blog', $link);
$result = mysql_query('SELECT id, title FROM post', $link);
$posts = array();
while ($row = mysql_fetch_assoc($result)) {
$posts[] = $row;
}
mysql_close($link);
// 包含HTML的代码
require 'templates/list.php';
下面是单独的html显示界面,文件里嵌套模板风格的php代码:
代码语言:javascript复制<!--templates/list.php-->
<html>
<head>
<title>文章列表</title>
</head>
<body>
<h1>文章列表</h1>
<ul>
<?php foreach ($posts as $post): ?>
<li>
<a href="/read?id=<?php echo $post['id'] ?>">
<?php echo $post['title'] ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</body>
</html>
- 到这里,一个新的问题产生了,现在只有一个页面,如果你的其他页面也需要用到同样的数据库连接,同样的数据的话,你可能还需要重新写一段这样的代码,对代码重构十分不友好,于是MVC产生了。
MVC
从应用程序中将核心行为和数据访问功能分离出来放入新的model.php文件中。
代码语言:javascript复制<?php
// model.php
function open_database_connection()
{
$link = mysql_connect('localhost', 'dbuser', 'dbpassword');
mysql_select_db('blog', $link);
return $link;
}
function close_database_connection($link)
{
mysql_close($link);
}
function get_all_posts()
{
$link = open_database_connection();
$result = mysql_query('SELECT id, title FROM post', $link);
$posts = array();
while ($row = mysql_fetch_assoc($result)) {
$posts[] = $row;
}
close_database_connection($link);
return $posts;
}
现在我们的index.php就是一个控制器,她变成了这个样子:
代码语言:javascript复制//index.php
<?php
require_once 'model.php';
$posts = get_all_posts();
require 'templates/list.php';
现在控制器的作用仅仅是从model(model.php)层中得到数据,然后调用一个模板来呈现这些数据。一个最简单的MVC诞生了。