---
title: "PHP Heredoc 的乐趣"
url: https://www.exakat.io/php-heredoc-%e7%9a%84%e4%b9%90%e8%b6%a3/
date: 2015-10-17
modified: 2015-10-17
author: "David 戴炜"
description: "Heredoc PHP Heredoc PHP 语法是PHP里面写入一大块的文字的方式，不是传统的使用单引号，双引号字符串分隔符。他依赖于 <<< 和一个用来表示这个字符串的结束的标示符。  <?php $string = <<<STRING $x elephpants STRING ; ?> Heredoc 还有一个Nowdoc替代, 它是Heredo的“单引号版本”。 它实际上在标示符定义上就是用了单引号，并且不会替换它里面的变量值。 <?php $string = <<<'STRING' $x elephpants STRING ; ?> Nowdoc 很少被使用。在Heredoc/Nowdoc的使用中，仅仅只有3%使用Nowdoc的语法。这个可能是因为Nowdoc最近才被加到语言中(PHP 5.3)，又或者是典型的担心未来可能会要使用字符串中的变量。..."
categories:
  - "Code auditing"
image: https://www.exakat.io/wp-content/uploads/2015/10/heredoc.png
word_count: 166
---

# PHP Heredoc 的乐趣

[![Heredc PHP和它的使用](http://178.62.231.40/wp-content/uploads/2015/10/heredoc.png)](http://178.62.231.40/wp-content/uploads/2015/10/heredoc.png)

## Heredoc PHP

[Heredoc PHP 语法](http://php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc)是PHP里面写入一大块的文字的方式，不是传统的使用单引号，双引号字符串分隔符。他依赖于 <<< 和一个用来表示这个字符串的结束的标示符。
 <?php
$string = <<<STRING

$x elephpants

STRING ;

?>

Heredoc 还有一个[Nowdoc替代](http://php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc), 它是Heredo的“单引号版本”。 它实际上在标示符定义上就是用了单引号，并且不会替换它里面的变量值。

<?php

$string = <<<'STRING'

$x elephpants

STRING ;

?>

Nowdoc 很少被使用。在Heredoc/Nowdoc的使用中，仅仅只有3%使用Nowdoc的语法。这个可能是因为Nowdoc最近才被加到语言中(PHP 5.3)，又或者是典型的担心未来可能会要使用字符串中的变量。

## Heredoc 标示符前10位排行榜

 

| 标示符 | 出现次数 |
| --------- | ------------ |
| EOT | 12607 |
| EOF | 2500 |
| EOD | 1452 |
| HTML | 940 |
| SQL | 822 |
| END | 453 |
| ICS | 449 |
| XML | 243 |
| 'EOF' | 219 |
| EOS | 205 |

目前为止，最通常的标示符是 EOT。 它实际上应该意思是“文字的末尾”(End Of Text)，使它作为一个字符串开始的标示符觉得有点奇怪。当然，当放在字符串末尾时它变得非常有意义。

注意到EOT也是文档里用来做标示符的选择！这是那些常见的例子中手册对开发人员选择他们的标示符有重大影响的一个：它在手册里使用，所以我们“应该”用它。

一个更有意思的Heredoc标示符的使用是那些有意义上的常被重复使用的例子。PHP 完全不在意标示符本身，但是其他工具确实喜欢这样的标示符：IDE和静态分析工具。比如，当使用HTML作为标示符，VIM 确实会激活对于这个字符串里的HTML语法高亮，并且保持文件代码里的PHP代码。

## 技术性的标示符

不用多说，对于读者来说，用标示符来表示某个语言在Heredoc里使用了是一个很好的预示。下面是那些最常被使用的技术性标示符来预示某个语言：

| 标示符 | 出现次数 |
| --------- | ------------ |
| HTML | 940 |
| SQL | 822 |
| XML | 243 |
| JS | 114 |
| JSON | 65 |
| CSS | 50 |
| VCARD | 20 |

## 表示一个Heredoc本意的标示符的使用

注意到，除了技术性的，其他一些标示符表示了一个blob的字符串的目的。那些，经常是需要在代码里的文字，但是不会被操作。它们被这样使用地很少。

| 标示符 | 出现次数 |
| --------- | ------------ |
| HELP | 61 |
| TEMPLATE | 33 |
| LONGDESC | 30 |
| CONTENT | 22 |
| DIGEST | 13 |
| HEADER | 7 |
| LEGEND | 6 |
| NEWS | 6 |

## Heredoc的搞笑标示符

最后，当然，既然标示符有完全的自由，它们一些被很多自由地选择使用。

| 标示符 | 出现次数 | 反讽(Sarcasm) |
| --------- | ------------ | --------------- |
| BLA | 40 | |
| HEREDOC | 39 | 我们至少知道它是什么 |
| BUFFER | 15 | |
| details | 9 | |
| FINDCHILDREN | 4 | 没有 Find Parents 么? |
| BAZ | 7 | 没有foo, 没有bar |
| CIA | 4 | 没有 FBI, 没有 NSA |
| helllo | 2 | 没有 English |
| FABRICE | 1 | 没有Damien |
| EOTURTLES | 1 | 没有Lion, 没有elephpants |
| PAPAYA | 1 | 没有 Pears, 没有 pecl |
| HUMPTYDANCE | 1 | 很多想象 |
| GOOD_JSON | 1 | 没有BAD_JSON |
| O | 12 | 甜蜜而短暂 |

 

## 附录

上面的统计来源于838个开源项目。它们代表二十五亿个PHP标示符和一千四百万行代码。我们为这篇文章收集了24,479 Heredoc / Nowdoc 语法使用的例子。

[![uk](http://178.62.231.40/wp-content/uploads/2015/06/uk.png)](http://178.62.231.40/wp-content/uploads/2015/06/uk.png)英语原文：http://178.62.231.40/fun-with-delimiters-of-heredoc-php/