heredoc(实现模板与代码的分离)

一、总结

heredoc实现模板与代码的分离,实现的是在后台编程语言中批量输出html代码,在这个批量输出的html代码中又可以嵌套编程语言变量。所以很方便。

比如php:如果不支持heredoc的话,就只能echo一行一行的输出html代码,这样人会疯掉的。还好php可以支持在html中非常方便的嵌套php代码(<?php ?>),也可以解决这个问题。

像那些不方便在html中直接嵌套的代码比如python,要是不想一行一行的输出html,heredoc是个不错的选择

视图页面的创建方法(后台语言以php为例):

1、在php中输出html:a、echo一行一行的输出  b、heredoc批量且格式明显的输出

2、在html中嵌套php代码

二、heredoc(实现模板与代码的分离)

heredoc技术,是一种Perl风格的字符串输出技术,可以很好的实现模板与代码的分离.

代码:

heredoc中批量输出html代码

复制代码 代码示例:
<?php
$name = '脚本学堂';
print <<<EOT
<html>

<head>


<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />


<title>php中heredoc技术用法详解-脚本学堂</title>


</head>


<body>


Hello,$name!


</body>


</html>

EOT;
?>
 

1.以<<<End开始标记开始,以End结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号。开始标记和开始标记相同,比如常用大写的EOT、EOD、EOF来表示,但是不只限于那几个,只要保证开始标记和结束标记不在正文中出现即可
2.位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以
3.heredoc常用在输出包含大量HTML语法d文档的时候。

比如:函数outputhtml()要输出HTML的主页。可以有两种写法。
很明显第二种写法比较简单和易于阅读。

复制代码 代码示例:
function outputhtml(){

echo "<html>";


echo "<head><title>脚本学堂首页</title></head>";


echo "<body>首页内容</body>";


echo "</html>;


}

function outputhtml()
{
echo <<<EOT
<html>
<head><title>脚本学堂首页</title></head>
<body>首页内容</body>
</html>
EOT;
}
outputhtml();

例2,定义了一个函数template

复制代码 代码示例:
function template($template, $EXT='htm') {
 $path = "template/$template.$EXT";
 return $path;
}

index.php

复制代码 代码示例:

<?php
$title = "This is title";
$content = "Heredoc";

include template('index');
?>

index.htm

复制代码 代码示例:

<!--<?php print <<<EOT

-->

<html>

<head><title>$title</title></head>

<body>

$content

</body>

</html>

<!--

EOT;

?>-->

我的目标是:把html从php中分离出来,并且html中不包含php控制程序。

在php4中,提供了print<<< HTML 功能。
举例如下:

复制代码 代码示例:
$data="这里是内容";
print<<< HTML
$data
HTML;
?>
 

输出:这里是内容。
另外一方面,php中有函数eval()。它能够执行php代码。我们就结合上述
知识来建立一个通用的函数getTpl().如下:

下面是demo.php

复制代码 代码示例:

<?php

function getTpl($tplname,$EXT='.htm')
{
extract($GLOBALS);
$path=$tplname.$EXT;
eval_r("print<<< EOT\n".readfn($path)."\nEOT;\n");
}

function readfn($fn)
{
$fp=fopen($fn,"rb");
return fread($fp,filesize($fn));
fclose($fp);
}

$title='这是标题';
$data='这里是内容';

getTpl('demo');

?>

下面是demo.htm

复制代码 代码示例:

<html>
<head>
<title> $title </title>
</head>

<body>
<b>$title</b>
<p>$data
</body>
</html>

经过这样的处理后,在demo.htm中只有php要替换的变量,而没有任何其他php的多余代码了。
这样以来,外观和程序逻辑就得以完全分离,为网站的修改和后期维护提供了方便之门!
注:以上方法分离了php和html,代表了显示和逻辑的分离。但是以失去复杂控制为代价的。

定界符
另一种给字符串定界的方法使用定界符语法(“<<<”)。应该在 <<< 之后提供一个标识符,然后是字符串,然后是同样的标识符结束字符串。

结束标识符必须从行的第一列开始。同样,标识符也必须遵循 PHP 中其它任何标签的命名规则:只能包含字母数字下划线,而且必须以下划线或非数字字符开始。

警告
很重要的一点必须指出,结束标识符所在的行不能包含任何其它字符,可能除了一个分号(;)之外。这尤其意味着该标识符不能被缩进,而且在分号之前和之后都不能有任何空格或制表符。同样重要的是要意识到在结束标识符之前的第一个字符必须是你的操作系统中定义的换行符。例如在 Macintosh 系统中是 \r。

如果破坏了这条规则使得结束标识符不“干净”,则它不会被视为结束标识符,PHP 将继续寻找下去。如果在这种情况下找不到合适的结束标识符,将会导致一个在脚本最后一行出现的语法错误。

不能用定界符语法初始化类成员。用其它字符串语法替代。
例子 11-3. 非法的例子

复制代码 代码示例:
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
 

定界符文本表现的就和双引号字符串一样,只是没有双引号。这意味着在定界符文本中不需要转义引号,不过仍然可以用以上列出来的转义代码。变量会被展开,但当在定界符文本中表达复杂变量时和字符串一样同样也要注意。

例子 11-4. 定界符字符串例子

复制代码 代码示例:

<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
class foo
{
var $foo;
var $bar;

function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}

$foo = new foo();
$name = 'MyName';

echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>

实例:
一、目录规划
phpLearn
 |----Templates
 ----index.html
 |----index.php

二、PHP文件

index.php中给变量赋值,同时包含模板

复制代码 代码示例:

<?php
$userNum1 = '123';
include ('Templates/index.html'); //包含模板

?>

三、模板文件
index.hhtml

复制代码 代码示例:

<!--<?php
echo <<<EOT
-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>-----------------------</title>
</head>

<body>
<br>
<br>
$userNum1 //使用变量
<br>
</body>
</html>
<!--
EOT;
?>
-->

总结:
1、echo <<<EOT 与 EOT;是成对出现的。如

复制代码 代码示例:

<!--
echo <<<EOT
-->
//在此处可以有HTML元素

<!--
EOT;
//在此处有PHP语法式的语句。

echo <<<EOT
-->

2、html模板内目录 以php文件所在的目录(路径) 为准。
3、html模板与php分离,可以不使用$_GET或则$_POST方法。直接使用名称作为变量。

您可能感兴趣的文章:
PHP echo heredoc语法的用法总结
php heredoc的用法举例
php中heredoc的方法(EOF)详解
深入PHP EOF(heredoc)用法详解
有关php中heredoc的例子与说明

您可能感兴趣的文章:
有关php中heredoc的例子与说明
php header函数使用要点
php file_get_contents函数抓取页面信息的代码
PHP获取当前网址及域名的代码
php跨域调用json的例子
JQuery AJAX 中文乱码问题解决
php 注释、变量、数组、常量及函数的应用介绍
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
php utf8 一半乱码的问题
nginx下fastcgi_param运行php出现空白页的问题

php中的heredoc技术,是一种Perl风格的字符串输出技术,可以很好的实现模板与代码的分离.

代码:

复制代码代码示例:
<?php
$name = '脚本学堂';
print <<<EOT
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>php中heredoc技术用法详解-脚本学堂</title>
</head>
<body>
Hello,$name!
</body>
</html>
EOT;
?>
 

1.以<<<End开始标记开始,以End结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号。开始标记和开始标记相同,比如常用大写的EOT、EOD、EOF来表示,但是不只限于那几个,只要保证开始标记和结束标记不在正文中出现即可。
2.位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。
3.heredoc常用在输出包含大量HTML语法d文档的时候。

比如:函数outputhtml()要输出HTML的主页。可以有两种写法。
很明显第二种写法比较简单和易于阅读。

复制代码代码示例:
function outputhtml(){
echo "<html>";
echo "<head><title>脚本学堂首页</title></head>";
echo "<body>首页内容</body>";
echo "</html>;
}
function outputhtml()
{
echo <<<EOT
<html>
<head><title>脚本学堂首页</title></head>
<body>首页内容</body>
</html>
EOT;
}
outputhtml();

例2,定义了一个函数template

复制代码代码示例:
function template($template, $EXT='htm') {
 $path = "template/$template.$EXT";
 return $path;
}

index.php

复制代码代码示例:

<?php
$title = "This is title";
$content = "Heredoc";

include template('index');
?>

index.htm

复制代码代码示例:

<!--<?php print <<<EOT

-->

<html>

<head><title>$title</title></head>

<body>

$content

</body>

</html>

<!--

EOT;

?>-->

我的目标是:把html从php中分离出来,并且html中不包含php控制程序。

在php4中,提供了print<<< HTML 功能。
举例如下:

复制代码代码示例:
$data="这里是内容";
print<<< HTML
$data
HTML;
?>
 

输出:这里是内容。
另外一方面,php中有函数eval()。它能够执行php代码。我们就结合上述
知识来建立一个通用的函数getTpl().如下:

下面是demo.php

复制代码代码示例:

<?php

function getTpl($tplname,$EXT='.htm')
{
extract($GLOBALS);
$path=$tplname.$EXT;
eval_r("print<<< EOT\n".readfn($path)."\nEOT;\n");
}

function readfn($fn)
{
$fp=fopen($fn,"rb");
return fread($fp,filesize($fn));
fclose($fp);
}

$title='这是标题';
$data='这里是内容';

getTpl('demo');

?>

下面是demo.htm

复制代码代码示例:

<html>
<head>
<title> $title </title>
</head>

<body>
<b>$title</b>
<p>$data
</body>
</html>

经过这样的处理后,在demo.htm中只有php要替换的变量,而没有任何其他php的多余代码了。
这样以来,外观和程序逻辑就得以完全分离,为网站的修改和后期维护提供了方便之门!
注:以上方法分离了php和html,代表了显示和逻辑的分离。但是以失去复杂控制为代价的。

定界符
另一种给字符串定界的方法使用定界符语法(“<<<”)。应该在 <<< 之后提供一个标识符,然后是字符串,然后是同样的标识符结束字符串。

结束标识符必须从行的第一列开始。同样,标识符也必须遵循 PHP 中其它任何标签的命名规则:只能包含字母数字下划线,而且必须以下划线或非数字字符开始。

警告
很重要的一点必须指出,结束标识符所在的行不能包含任何其它字符,可能除了一个分号(;)之外。这尤其意味着该标识符不能被缩进,而且在分号之前和之后都不能有任何空格或制表符。同样重要的是要意识到在结束标识符之前的第一个字符必须是你的操作系统中定义的换行符。例如在 Macintosh 系统中是 \r。

如果破坏了这条规则使得结束标识符不“干净”,则它不会被视为结束标识符,PHP 将继续寻找下去。如果在这种情况下找不到合适的结束标识符,将会导致一个在脚本最后一行出现的语法错误。

不能用定界符语法初始化类成员。用其它字符串语法替代。
例子 11-3. 非法的例子

复制代码代码示例:
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
 

定界符文本表现的就和双引号字符串一样,只是没有双引号。这意味着在定界符文本中不需要转义引号,不过仍然可以用以上列出来的转义代码。变量会被展开,但当在定界符文本中表达复杂变量时和字符串一样同样也要注意。

例子 11-4. 定界符字符串例子

复制代码代码示例:

<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
class foo
{
var $foo;
var $bar;

function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}

$foo = new foo();
$name = 'MyName';

echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>

实例:
一、目录规划
phpLearn
 |----Templates
 ----index.html
 |----index.php

二、PHP文件

index.php中给变量赋值,同时包含模板

复制代码代码示例:

<?php
$userNum1 = '123';
include ('Templates/index.html'); //包含模板

?>

三、模板文件
index.hhtml

复制代码代码示例:

<!--<?php
echo <<<EOT
-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>-----------------------</title>
</head>

<body>
<br>
<br>
$userNum1 //使用变量
<br>
</body>
</html>
<!--
EOT;
?>
-->

总结:
1、echo <<<EOT 与 EOT;是成对出现的。如

复制代码代码示例:

<!--
echo <<<EOT
-->
//在此处可以有HTML元素

<!--
EOT;
//在此处有PHP语法式的语句。

echo <<<EOT
-->

2、html模板内目录 以php文件所在的目录(路径) 为准。
3、html模板与php分离,可以不使用$_GET或则$_POST方法。直接使用名称作为变量。

heredoc(实现模板与代码的分离)的更多相关文章

  1. c++类定义代码的分离

    类文件 实际工程中,对一个类的说明.架构.描述方法是:    往往分成头文件和实现的源文件,来实现代码的分离 然后,源文件中包含类的头文件... 头文件的包含问题: 类对应的实现文件cpp.main主 ...

  2. c++模板函数声明定义分离编译错误详解

    今天看到accelerated c++上有个简单的vector容器的实现Vec,就再vs2008上编译了下: ///// Vec.h #ifndef GUARD_VEC_H #define GUARD ...

  3. C++模板类代码只能写在头文件?

      这个问题,实际上我几年前就遇到了.最近写个模板类玩的时候,再次遇到.   当我非常仔细的将定义和实现分开,在头文件中保留了最少的依赖后,一切就绪.cpp单独编过.但是当使用的时候,就会报告所有的函 ...

  4. WPF换肤之四:界面设计和代码设计分离

    原文:WPF换肤之四:界面设计和代码设计分离 说起WPF来,除了总所周知的图形处理核心的变化外,和Winform比起来,还有一个巨大的变革,那就是真正意义上做到了界面设计和代码设计的分离.这样可以让美 ...

  5. 在vue中使用import()来代替require.ensure()实现代码打包分离

    最近看到一种router的写法 import Vue from 'vue' import Router from 'vue-router' Vue.use(Router) const login = ...

  6. vue如何实现代码打包分离(按需加载)

    在vue中使用import()来代替require.ensure()实现代码打包分离 一.require.ensure() 方法来实现代码打包分离 require.ensure() 是 webpack ...

  7. 创建JDBC模板简化代码、JDBC应用的事务管理以及连接池的作用

    一.创建JDBC模板简化代码 一个简单的查询.要做这么一大堆事情,并且还要处理异常,我们不防来梳理一下: 1.获取connection  2.获取statement  3.获取resultset  4 ...

  8. 编程算法 - 求1+2+...+n(模板类) 代码(C++)

    求1+2+...+n(模板类) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 求1+2+...+n, 要求不能使用乘除法\for\whil ...

  9. Confluence未授权模板注入/代码执行(CVE-2019-3396)

    --- title: Confluence未授权模板注入/代码执行(CVE-2019-3396) tags: [poc,cve] num :g7y12 --- # 简介 --- Confluence是 ...

随机推荐

  1. Web开发中,使用表格来展示每个角色对应的权限

    通过表格这种方式,来展示角色和权限之间的关系,挺好的.还有很多场景,都可以用这种方式. 角色权限表 权限 系统管理员 文章管理员 相册管理员 留言管理员 个人信息管理 查看个人信息 √ √ √ √ 编 ...

  2. 【Uva 1633】Dyslexic Gollum

    [Link]: [Description] 输入正整数n和k(1≤n≤400,1≤k≤10),求长度为n的01串中有多少个不含长度至少 为k的回文连续子串.例如,n=k=3时只有4个串满足条件:001 ...

  3. UDP 打洞示例 包含 服务器 客户端

    客户端示例: #include "Net.h" #include "../p2pInfo.h" int main() { CUdp  udp; if (0!=u ...

  4. Day6下午题解1

    预计分数:100+?+30=130+? 实际分数:100+25+30=155 T1 https://www.luogu.org/problem/show?pid=T15920 DP裸题,用dp[i][ ...

  5. BZOJ2160: 拉拉队排练(Manacher)

    Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训 ...

  6. CISP/CISA 每日一题 七

    CISA 每日一题(答) 确保只有恰当授权的出站交易才能被处理,控制目的: 1.出站交易是基于授权而被启动: 2.出站交易包含了唯一的预先授权的交易类型: 3.出站交易只能被发送到合法的商业伙伴那里. ...

  7. POJ 3009 Curling 2.0 {深度优先搜索}

    原题 $On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules ...

  8. Python基础教程之第1章 基础知识

    #1.1 安装Python #1.1.1 Windows #1.1.2 Linux和UNIX #1.1.3 Macintosh #1.1.4 其它公布版 #1.1.5 时常关注.保持更新 #1.2 交 ...

  9. Android学习之图片压缩,压缩程度高且失真度小

    曾经在做手机上传图片的时候.直接获取相机拍摄的原图上传,原图大小一般1~2M.因此上传一张都比較浪费资源,有些场景还须要图片多张上传,所以近期查看了好多前辈写的关于图片处理的资料.然后试着改了一个图片 ...

  10. 【SonicUI】关于字体高亮的问题。。

    m_pSonicString[1]->Format(_T("/c=%x, a='http://hi.csdn.net/', linkh=0xFF00F0, font, font_hei ...