表现与业务逻辑分离
PHP和HTML混写很乱,怎么解决?
一个页面分成两个文件即可,一个PHP做逻辑,一个HTML做模板,这叫做“表现与业务逻辑分离”。
比如“首页”index.php
分成:index.php
和index.html
。index.php
代码如下:
<?php
$articles = [];
$file = './articles.json';
if (file_exists($file)) {
$tmp = file_get_contents($file);
if (!empty($tmp)) {
$articles = json_decode($tmp, true);
}
}
$d = []; //d 表示 data,后面会用到
$d['articles'] = $articles;
require_once __DIR__ . '/index.html';
index.html
代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cmn-Hans" lang="cmn-Hans">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>在线阅读</title>
</head>
<body>
<h1>在线阅读</h1>
<div><a href="./create_article.html">写文章</a></div>
<?php
if (!empty($d['articles'])) {
echo '<ul>';
foreach ($d['articles'] as $k=>$v) {
$id = $k + 1;
echo '<li><a href="./get_article.php?id=' . $id . '">' . $v['title'] . '</a>';
echo '<p>' . mb_substr($v['content'], 0, 100, 'UTF-8') . '……</p></li>';
}
echo '</ul>';
}
?>
</body>
</html>
作业:把show_article.php
和store_article.php
也拆分了,写完之后对比本书提供的代码:github.com/sinkcup/phbook/tree/0.3。
拆分之后诞生一个小问题:访问http://localhost/时,其实访问的是http://localhost/index.php还是http://localhost/index.html呢?
答:不一定,由配置决定。回头看《搭建开发环境服务器》最后的截图,配置里面是这样的:
DirectoryIndex index.php index.php3 index.html index.htm
按照先后顺序,这个会优先使用index.php
做首页,如果没有的话,再用index.html
。而有的配置是这样的:
DirectoryIndex index.html index.php
这就会优先使用index.html
,不符合本节的要求,需要改一下,然后重启Apache。Linux下重启的命令是:
sudo service apache2 restart
发表文章之后,页面怎么出现HTML错误甚至乱码了?
打开store_article.php
的代码看一下,只输出了“发表成功”,这不是网页。一个正常的网页需要包含DOCTYPE、head、body等内容,其中head里的charset声明了编码,浏览器才能正常显示。所以添加一个notice.html
模板,然后store_article.php
里包含它即可。代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cmn-Hans" lang="cmn-Hans">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>提示:<?=$d['notice']['msg']?></title>
</head>
<body>
<h1>提示:<?=$d['notice']['msg']?></h1>
<p><a href="/">回到首页</a></p>
</body>
</html>
总结一下
我的技术水平
HTML | 服务器部署 | PHP | 数据存储 | HTTP协议 |
---|---|---|---|---|
HTML标准和语义化 | 安装WAMP/LAMP | 让内容动起来 | json文件存数据 | GET、POST |
charset | 表现与业务分离 |
作业
- 程序员的自我修养:“HTML 4”用的是“charset”,“XHTML 1.0”用的是“encoding”,哪个表意更准确的?
- 扩展阅读:《百万年薪的人都是怎么过日子的? - 知乎》
待解决的问题
-
查看
get_article.php
的代码,读一篇文章,却把所有文章取了出来,再取其中一篇,这样浪费性能啊,如果文章有成千上万篇,那怎么办?且听下回分解。