PHP代码分离
所谓的代码分离 其实只是一种思路,既然是一种思路 那就意味着他是有需求的 没有需求就没有解决方案 没有方案就不存在思路。
在这之前,我们制作 PHP 程序页面的时候。都是 HTML 和 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>
这种编写方使得这个PHP 程序放到 DW 等可视化工具里编辑时。还能完整的看到原来的网页效果。 我们只要记住。这个模板需要一个名为 $list 的数组变量就可以了。
<?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"); ?>
这是使用模板的PHP程序。中间那里。读取数据的时候。我并没有使用输出。而是赋值到一个名为 $list 的数组变量里。读取结束后,使用 include 包含这个模板文件。 显示效果如下
<?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'); ?>
$GLOBALS['list'] = $list;
在这里,我们把我们准备好的数据。存放到 全局变量 中。 然后,在自定义函数里,通过这个全局变量,还原出变量。
但是,考虑到预定义变量。常常用于其他用途。这里还是放弃了这种做法。
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'); ?>
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');
现在,使用模板成了这样子。准备好要赋值的数据。赋值到指定的标记上。 只在最后 方法时,才调用模板并显示。现在看看,如果代码写成这样。给我们来带了多少好处。