PHP和HTML代码分离

  在这之前,我们开发 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

PHP生成HTML静态页原理
上一篇 2014-02-17
唐家崴子游记
下一篇 2014-07-03

评论列表(0条)

  • 暂无评论

发表评论

captcha

相关推荐

  • PHP图片防盗链技术

      图片防盗链的核心原理:验证图片请求的域名来源,只允许本站加载图片,拒绝外部未授权网站引用图片地址,以达到防盗链的目的。   浏览器请求图片时,会执行HTTP_REFERER请求头,记录从哪个页面发起请求,用程序判断读取该来源的地址,是否是合法域名,是则输出图片,否则返回禁止图片或403。   方案1:基础防盗链   img.php &lt;?php // 允许访问的域名 $allow_hosts = [ 'localhost......

    2013-10-06
    34560
  • PHP动态滚屏无刷新加载数据

      滚屏加载,也称为滚动加载或懒加载,是一种网页设计技术,当用户滚动页面时,新内容会自动加载,无需点击&ldquo;下一页&rdquo;按钮。这种技术提高了用户体验,尤其是在处理大量数据时,如社交媒体、新闻网站和电子商务平台。   滚屏加载技术,就是使用Javascript监视滚动条的位置,每次当滚动条到达浏览器窗口底部时,触发一个Ajax请求后台PHP程序,返回相应的数据,并将返回的数据追加到页面底部,从而实现了动态加载,其实就是一个......

    2013-10-24
    22240
  • PHP生成HTML静态页原理

      在PHP中生成HTML文件静态页,在后续的访问可以直接加载静态文件而无需再次执行PHP脚本。这可以提高网站性能,减轻服务器负担,并改善页面加载速度。   用一个简单的小项目来说明PHP生成HTML静态页原理,包含:模板分离、自动创建目录、生成静态页、更新静态页、删除静态页、生成列表页+详情页、防重复生成、错误提示等功能。   项目结构 / ├── template/ # 模板文件夹 │ ├── index.h......

    2014-02-17
    16000
  • PHP图片验证码功能简单开发

      验证码是网站开发中常用的功能,可以保证用户提交数据和服务器的安全,验证码的形态也是千奇百怪,从传统的数字+字母,到拼图,再到找元素等等越来越复杂。   今天说一下用PHP原生开发方式如何写一个最常见的数字+字母图片验证码功能,过程非常简单。   首先创建验证码生成文件verify.php &lt;?php // 开启session session_start(); // 创建图片资源,宽高 $img = imagecreatetru......

    2014-08-02
    21070
  • PHP框架的实现原理

      PHP框架的实现原理是通过采用MVC模式、路由机制、依赖注入、模板引擎和数据库操作等技术,构建一个结构清晰、易于维护和扩展的应用程序框架。下面是一个简单的PHP框架示例,演示了基本的实现原理:   简单的PHP框架文件结构 /simple_framework |-- app | |-- controllers | | |-- HomeController.php | |-- models | | ......

    2017-10-04
    15502
  • PHP使用QR Code生成二维码实例

      要在PHP中生成二维码,可以使用第三方库,其中一个流行的是PHP QR Code库。以下是一个简单的示例,演示如何使用PHP QR Code库生成二维码。   使用 Composer 安装 PHP QR Code: composer require chillerlan/php-qrcode   PHP 生成二维码示例 &lt;?php // 引入 Composer 的自动加载文件 require_once 'vendor/aut......

    2021-10-07
    17750
  • TinyMCE插入代码块强制显示行号

      TinyMCE自带codesample插入代码功能不支持行号,需要依靠Prism.js行号插件实现。在编辑器插入代码会生成如下代码: &lt;pre class="line-numbers language-javascript"&gt; &lt;code&gt; 代码内容 &lt;/code&gt; &lt;/pre&gt;   注意:class里的line-numbers类有时会没有自己加上,导致前台不显示行号,可能是个......

    2023-03-20
    12070
  • ThinkPHP获取数据库类型和版本的方法

      在开发后台功能时,可能会需要自动获取当前使用的数据库类型和版本的情况,下面就举个简单的例子实现自动获取当前项目使用的是MySQL还是SQLite数据库及使用的相应数据库版本的方法: // 数据库类型 $default = config('database.default'); $config = config('database.connections.' . $default); $db_type = strtolower(tri......

    2024-11-02
    8890