php heredoc

来源:互联网 发布:珊瑚绒床单淘宝 编辑:程序博客网 时间:2024/04/29 23:21

php中heredoc技术用法详解:
php中的heredoc技术在一些PHP文档和书籍中一般没有详细讲述,只是提到了这是一种Perl风格的字符串输出技术,没有做过多的介绍, 没有介绍不代表它不重要,它能很好的来实现模板与代码的分离.
看下面的代码:
<?php
$name = 'php自学网';
print <<<EOT
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>php中heredoc技术用法详解-php自学网</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>php自学网首页</title></head>";
echo "<body>首页内容</body>";
echo "</html>;
}
function outputhtml()
{
echo <<<EOT
<html>
<head><title>php自学网首页</title></head>
<body>首页内容</body>
</html>
EOT;
}
outputhtml();

例子二

定义了一个函数template
[php]function template($template, $EXT='htm') {
 $path = "template/$template.$EXT";
 return $path;
}[/php]

index.php

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

include template('index');
?>[/php]

index.htm

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

-->

<html>

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

<body>

$content

</body>

</html>

<!--

EOT;

?>-->

php程序界有很多种模板技术和方法;但使用起来大多不太方便。
我经过思考和测试,发明了一种简单而巧妙的方法。

我的目标是:把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模板的基本思路与方法总结

使用php模板才能真正使自己从面向过程的编程渐渐转向面向对象的编程过程中。

原创粉丝点击