在PHP中,"<<<"代表什么?

78
例如:
$sql = <<<MySQL_QUERY

2
你可以阅读PHP文档中的Heredoc语法以更好地理解。 - David Hancock
如果您需要解释其他符号,这是一个很好的参考 - Wrikken
https://dev59.com/em035IYBdhLWcg3wBLNL - zloctb
8个回答

86

这是heredoc语法。你可以通过输入<<<和自己选择的标记来开始一个heredoc字符串,并且通过在新行上只输入该标记(什么也不加!)来结束它。作为一种便利,有一个例外:你可以在结束定界符后添加一个分号。

例如:

echo <<<HEREDOC
This is a heredoc string.

Newlines and everything else is preserved.
HEREDOC;

8
这与普通字符串有何不同?为什么不能只使用 echo "This is a heredoc....." 呢? - CodyBugstein
5
据我所记,您可以在heredoc中放置单引号和双引号以及变量,并且一切都会正常工作。如果您想在echo语句中使用双引号,则必须对其进行转义。然而,我很快就停止使用heredoc了,因为我不喜欢为此打破我的缩进模式。现在,我通过形成许多字符串数组来构建我的字符串,然后再使用 implode("\n",$string_array) 连接它们。 - Buttle Butkus
1
我认为,如果你想注入不同的语言,这是非常有用的。能够使用换行符而无需连接(这可能会破坏代码完成等)真的很不错。 - SourceOverflow

26

这被称为 heredoc,它允许你编写跨越多行的长文本。你可以在其中放置 PHP 变量,并且它们将替换为变量的值。单词 CHART 可以是任何东西,只需要与引用文本开始和结束处相同即可。

你可以通过附加多个引用字符串来实现相同的效果,但对于像这样的 HTML 文本一样的扩展文档,这种方法更加清晰。还有一种叫做 nowdoc 的东西,类似于 PHP 中的单引号字符串,但这些字符串不允许在其中使用变量。


哦,好的,谢谢。我觉得不用浪费太多时间去搜索,直接问一个简短的问题就好了。 - user1464971

23

这是使用HEREDOC语法的字符串开头。

另一种定界字符串的方法是使用heredoc语法:<<<。

在此运算符之后提供一个标识符,然后是一个换行符。字符串本身紧随其后,然后再次使用相同的标识符来关闭引号。


酷,我不知道那个......我读了你发的链接,老实说,我理解为什么到现在为止我可以没有它! ;) 对于字符串使用它有什么好处呢? - Gabriel
9
@Gabriel 允许你在字符串中同时使用两种引号而不会破坏它:<<<END Hello "$name"! How is '$spouse' today? END 然而,一个非常麻烦的问题是,END 标记不能有缩进,所以 Heredoc 的内容通常会破坏你代码的缩进。这确实不是 PHP 最重要的功能之一 :) - Pekka
@YiJiang,那实际上是因为德国本地化!该死的地理位置,即使我的浏览器语言是英语,它总是给我错误的链接。已经更正,干杯 :) - Pekka
@Gabriel 不用谢。@Hugo 说得有道理,有些情况下它们确实是有意义的,并且有助于使代码更易读。但是缺少缩进功能至少在我的实践中会带来很多问题。 - Pekka

16
这是PHP的heredoc语法,详见这里
示例:
$sql = <<<MySQL_QUERY
SELECT * 
FROM TAB 
WHERE A = 1 AND B = 2 
MySQL_QUERY;           

8
这是heredoc语法
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

8

这是一个heredoc语法,用于处理长字符串而无需担心引号等问题。如果您注意到单词CHART,然后有一行写着CHART;,那就表示字符串的结尾。

使用这种格式时需要记住的重要事项是,无论您用什么字符串来定义字符串的结尾(例如在本例中的CHART),该单词必须出现在其自己的一行上,后跟一个分号,并且不能在同一行上有任何字符,即使是空格,否则PHP会认为它是字符串的一部分。


7

我发现在PHP中,HeredocNowdoc都非常强大和有用,我很惊讶迄今没有人给出更多的例子。

首先,HeredocNowdoc之间的区别很简单:

  • Heredoc:类似于""双引号字符串,可以放置变量
  • Nowdoc:类似于''单引号字符串,不会解析任何变量

为了展示Nowdoc,只需将标记包裹在单引号内-> 'TOKEN'即可。

特点和优势

  • ""和''可以随意添加而不会导致任何错误
  • 使用动态变量轻松输出HTML代码,避免繁琐的拼接操作。
  • 将其存储在变量中供后续使用,可以创建小组件并快速输出它们。
  • 行文字面意义解释,'\\n'表示换行符,因此就像写在文档中一样,也可以使用nl2br添加

简单实例

$a = "Hello";
$b = "World";
// HEREDOC
echo <<<HEREDOC
<strong> HEREDOC:  </strong> 
Variable A: "$a" 
Variable B: "$b"
HEREDOC;
echo '</br>';

// NOWDOC
echo <<<'NOWDOC'
<strong> NOWDOC:  </strong> 
Variable A: "$a" 
Variable B: "$b"
NOWDOC;

输出

HEREDOC: Variable A: "Hello" Variable B: "World"
NOWDOC: Variable A: "$a" Variable B: "$b"

食谱

  1. 使用 nl2br 为每行添加 <br>

这种方法有效是因为 HEREDOC 把每个 \n 解释为一个实际的行

   // HEREDOC
    echo nl2br(<<<HEREDOC
    <strong> HEREDOC:  </strong> 
    Variable A: "$a" 
    Variable B: "$b"
    HEREDOC);
    // Output HEREDOC:
    //Variable A: "Hello"
    //Variable B: "World"
  1. Create small components

         <?php
             foreach($tasks  as $task) {
                 // Create an HTML like component
                 $component = <<<HEREDOC
                 <div class="pure-u-1-3">
                     <div class="card">
                         <div class="card-header">
                            {$task['name']}
                         </div>
                         <div class="card-body">
                             <h5 class="card-title"> {$task['state']} </h5>
                             <p class="card-text"> {$task['description']} </p>
                             <a href="view?model=todo_list&task_id={$task['id']}" class="btn btn-primary">See Task Todos</a>
                         </div>
                     </div>                    
                 </div>
                 HEREDOC;
                 echo $component; // Output
    
             }
    
         ?>
    

或者只需将一个字符串放入,然后使用一个echo输出

    <?php
        $taskRendered = '';
        foreach($tasks  as $task) {
            // Create an HTML like component
            $component = <<<HEREDOC
            <div class="pure-u-1-3">
                <div class="card">
                    <div class="card-header">
                       {$task['name']}
                    </div>
                    <div class="card-body">
                        <h5 class="card-title"> {$task['state']} </h5>
                        <p class="card-text"> {$task['description']} </p>
                        <a href="view?model=todo_list&task_id={$task['id']}" class="btn btn-primary">See Task Todos</a>
                    </div>
                </div>                    
            </div>
            HEREDOC;
            $taskRendered .= $component;
        }
        echo $taskRendered; // Output
    
    ?>

文档


有点追求完美,关于Recipies的第一个代码块,HEREDOC); 应该改为 HEREDOC; - undefined

-1

为了更清晰地理解:

$data = array(
  "Id" => 12345,
  "Cutomer" => "hi",
  "Quantity" => 2,
  "Price" => 45
);

curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));

如果我们使用<<<

$data = <<<DATA
{
  "Id": 12345,
  "Customer": "John Smith",
  "Quantity": 1,
  "Price": 10.00
}
DATA;

curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

结论:如果我们选择第一种方法,我们必须将其转换为json_encode(),这需要一些处理。相反,我们可以使用<<<运算符来节省时间并获得更清晰的代码。 :)

2
“<<<”的例子显然不是干净的代码。我不建议任何人使用heredoc构造数组数据。 - laketuna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接