在这之前,我们开发 PHP 程序的时候,都是 HTML 和 PHP 混合写在一起的。但是代码混写会有一些问题,比如说:表单页和 PHP 页如果写在一起的话,页面运行时就会马上执行写入操作,而这个时候表单还没有提交。另外,表单提交以后,也不需要再显示表单页了。于是就有了判断。
if($_POST) {
//处理提交后的数据
} else {
//显示表单
}
用 if 把程序分成两个流程。
在显示表单的时候。中间得插上一段长长的 HTML 代码。 写好的代码,重新读起来相当不便。有时候自己都找不到后面的 } 写在哪一行了。 这个时候。代码分离的方案。就有用武之地了。
这个逻辑。意味着一个事情:所有 HTML 代码都是用于输出的。 那 PHP 代码做什么的。计算,流程控制。 于是呢,就有程序员开始这么想。把 HTML 分离开来。需要显示它的时候。再用 include 函数把 HTML 包含进来。
像刚才的表单提交。我们可以这样写
if($_POST) {
} else {
include("post.htm");
}
PHP 代码和 HTML 分开了,我们只要写纯PHP代码就可以了,在程序执行后,包含这个模板文件进来,把所有变量输出在模板中。而HTML页中用很小的PHP代码块,嵌入HTML代码中,获取后端传来的数据,完全不干涉HTML代码,这就是最基本的代码分离实现的方法。
做一个简单的示例,从数据库中查询数据,这是一个纯PHP代码文件,在执行查询后把用于输出内容的HTML模板文件tpl.php包含进来:
<?PHP
$link = mysql_connect("localhost", "root", "qsdmt0409");
mysql_select_db("test");
mysql_query("set names gbk");
$sql = "select * from `gbook`";
$rs = mysql_query($sql);
$list = array();
while($line = mysql_fetch_assoc($rs)) {
$list[] = $line;
}
include("tpl.php");
?>
模板文件tpl.php,用于循环输出留言内容:
<html>
<head>
<title>测试用模板</title>
</head>
<body>
<table border="1" width="600">
<tr>
<td width="40">ID</td>
<td width="100">姓名</td>
<td>联系方式</td>
</tr>
<?PHP foreach($list as $v) { ?>
<tr>
<td>
<?PHP echo $v['id']; ?>
</td>
<td>
<?PHP echo $v['name']; ?>
</td>
<td>
<?PHP echo $v['link']; ?>
</td>
</tr>
<?PHP } ?>
</table>
</body>
</html>
代码分离让我们的代码更简洁明了,更易读易改。让后端业务代码和前端代码开发独立分工。我们还可以封装这样的一个加载模板的自定义函数:
function tpl( $name ) {
include($name . ".php");
}
使用foreach来遍历数组读取索引和值,取索引重新组成一个新的变量,赋值为它当前值:
<?PHP
function tpl( $name ) {
foreach($GLOBALS as $k=>$v) $$k=$v;
include($name . ".php");
}
$link = mysql_connect("localhost", "root", "qsdmt0409");
mysql_select_db("test");
mysql_query("set names gbk");
$sql = "select * from `gbook`";
$rs = mysql_query($sql);
$list = array();
while($line = mysql_fetch_assoc($rs)) {
$list[] = $line;
}
$GLOBALS['list'] = $list;tpl('tpl');
?>
我们还可以使用自定义变量,然后通过自定义函数的参数传进去:
function tpl( $name, $data ) {
foreach($data as $k=>$v) $$k=$v;
include($name . ".php");
}
$list = array();
while($line = mysql_fetch_assoc($rs)) {
$list[] = $line;
}
$data = array();
$data['list'] = $list;
tpl('tpl', $data);
还有另一种方法,就是把变量放到另一个自定义函数中保存起来,需要的时候再读出来。静态变量可以做到这一点:
function set_var($name = NULL, $value = NULL) {
static $data = array();
if(is_null($name)) return $data;
$data[$name] = $value;
}
里面声明$data是一个静态变量,静态变量,使用它的值不会消失,而会被一直保留到PHP运行结束。重复运行这个函数,里面的静态变量值,不会被重新赋值。如果变量名未指定,则返回数组,否则给数组新定义一个索引,并赋值为指定的值:
<?PHP
function set_var($name = NULL, $value = NULL) {
static $data = array();
if(is_null($name)) return $data;
$data[$name] = $value;
}
function tpl( $name) {
$data = set_var();
foreach($data as $k=>$v) $$k=$v;
include($name . ".php");
}
$link = mysql_connect("localhost", "root", "qsdmt0409");
mysql_select_db("test");
mysql_query("set names gbk");
$sql = "select * from `gbook`";
$rs = mysql_query($sql);
$list = array();
while($line = mysql_fetch_assoc($rs)) {
$list[] = $line;
}
set_var('list', $list);
tpl('tpl');
?>
现在代码如上,使用set_var函数,把要显示的变量,记忆到另一个世界中。然后,在读取模板之前,把变量重新读回来,并恢复成普通的变量。当然,之前用一个变量来记忆也是一个办法,但是始终是占用了程序的变量。
我们可以试试看,多赋值几个:
<h1>
<?PHP echo $title; ?>
</h1>
<hr />
set_var('title', '这里是大标题');
tpl('tpl');
为了省事,我把它们封装成一个类:
class tpl {
public function set_var($name = NULL, $value = NULL) {
static $data = array();
if(is_null($name)) return $data;
$data[$name] = $value;
}
public function p( $name) {
$data = $this->set_var();
foreach($data as $k=>$v) $$k=$v;
include($name . ".php");
}
}
使用这个类:
$tpl = new tpl();
$link = mysql_connect("localhost", "root", "qsdmt0409");
mysql_select_db("test");
mysql_query("set names gbk");
$sql = "select * from `gbook`";
$rs = mysql_query($sql);
$list = array();
while($line = mysql_fetch_assoc($rs)) {
$list[] = $line;
}
$tpl->set_var('list', $list);
$tpl->set_var('title', '这里是大标题');
$tpl->p('tpl');
代码中不再含有HTML码,清晰简单了许多。我们可以专心写PHP代码,只要准备好要输出的变量就可以了,set_var会帮我们把这些值,复制到另一个世界中保存的。
本站原创内容,转载请注明来源:https://www.liutonghui.com/62.html
评论列表(0条)
暂无评论