【问题标题】:In PHP, what does "<<<" represent?在PHP中,“<<<”代表什么?
【发布时间】:2011-04-11 15:10:22
【问题描述】:

例如:

$sql = <<<MySQL_QUERY

【问题讨论】:

标签: php string operators heredoc


【解决方案1】:

这是 heredoc 语法。您通过将&lt;&lt;&lt; 加上您选择的标记来开始一个heredoc 字符串,并通过仅将标记(而不是其他任何东西!)放在新行上来终止它。为方便起见,有一个例外:您可以在结束分隔符后添加一个分号。

例子:

echo <<<HEREDOC
This is a heredoc string.

Newlines and everything else is preserved.
HEREDOC;

【讨论】:

  • 这和普通字符串有什么区别?为什么不直接做echo "This is a heredoc....."
  • @Imray 据我所知,您可以将单引号和双引号放入 heredoc 以及变量中,一切都会正常工作。如果您想在 echo 语句中使用双引号,则必须转义它们。尽管如此,我在开始后不久就停止使用heredoc,因为我不喜欢为此破坏我的缩进模式。现在我将我的许多字符串形成为数组,稍后implode("\n",$string_array)
  • 我认为如果你想注入不同的语言,它非常有用。能够在没有连接的情况下使用换行符(这可能会破坏代码完成等)非常好。
【解决方案2】:

它是使用HEREDOC syntax.的字符串的开头

第三种分隔字符串的方法是 heredoc 语法:

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

【讨论】:

  • 酷,我不知道那个...我阅读了您发送的链接,老实说,我明白为什么到目前为止没有那个我还能活下去! ;) 将它用于字符串有什么好处?
  • @Gabriel 它允许您在字符串中使用两种引用而不破坏它:&lt;&lt;&lt;END Hello "$name"! How is '$spouse' today? END 然而,一个巨大的痛苦是,END 标记不能缩进,所以 Heredoc 内容通常会破坏代码的缩进。这确实不是 PHP 最重要的特性之一 :)
  • @YiJian 原来是因为德语本地化!该死的地理位置,即使英语是我的浏览器语言,也总是给我错误的链接。更正了,干杯:)
  • @Gabriel 不客气。 @Hugo 确实有一点道理,但在某些情况下,它们 确实 有意义并有助于使代码更具可读性。但至少在我的实践中,缺少的缩进能力需要很多东西
【解决方案3】:

这称为heredoc,它可以让你写一段跨越几行的长文本。您可以将 PHP 变量放在那里,它们将替换为该值。 CHART 这个词可以是任何东西。只需要在引用文本的开始处开始和停止相同即可。

你可以通过附加多个带引号的字符串来做同样的事情,但大多数时候这对于像这样的 HTML 文本这样的扩展文档来说更简洁。还有一个叫做 nowdoc 的东西,它就像 PHP 中的单引号字符串,但它们不允许您在其中使用变量。

【讨论】:

  • 哦,好的,谢谢。而不是搜索很长时间,我想我会问一个简单的问题
【解决方案4】:

这是 PHP 的 heredoc

例子:

$sql = <<<MySQL_QUERY
SELECT * 
FROM TAB 
WHERE A = 1 AND B = 2 
MySQL_QUERY;           

【讨论】:

    【解决方案5】:

    这是一个heredoc,对于长字符串,您不必担心引号之类的。如果您注意到 CHART 一词,然后有一行显示 CHART;,则表示字符串的结尾。

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

    【讨论】:

      【解决方案6】:

      这是heredoc syntax

      $str = <<<EOD
      Example of string
      spanning multiple lines
      using heredoc syntax.
      EOD;
      

      【讨论】:

        【解决方案7】:

        我发现PHP 中的HeredocNowdoc 都非常强大和有用,我很惊讶到目前为止没有人提供更多关于你可以做什么的例子。

        首先HeredocNowdoc的区别很简单,

        • Heredoc: 就像 "" 双引号字符串你可以放变量
        • Nowdoc: 就像'' 单引号字符串没有变量被解析

        对于以下示例,我将只显示Heredoc,为了制作Nowdoc,只需将令牌包含在单引号内 -> 'TOKEN'。

        特点和优势

        • "" 和 '' 可以根据需要添加,不会导致任何错误
        • 使用动态变量轻松输出 HTML 代码,避免 useell 连接。
        • 将其存储在变量中以供字母使用,可以创建小组件并直接输出。
        • Lines 用 '\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 为每一行添加&lt;br&gt;

        这是可行的,因为 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. 创建小组件

               <?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
          
                   }
          
               ?>
          

        或者只输入一个字符串,然后输出 1 个回显

            <?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
            
            ?>
        

        文档

        【讨论】:

          【解决方案8】:

          要想清楚:

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

          如果我们使用&lt;&lt;&lt;:

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

          结论:如果我们采用第一种方法,我们必须将其转换为json_encode(),这在某种程度上需要一些处理。相反,我们可以使用&lt;&lt;&lt; 运算符来节省一些时间并获得一些干净的代码。 :)

          【讨论】:

          • &lt;&lt;&lt; 示例肯定不是干净的代码。我不建议任何人使用 heredoc 构造数组数据。
          猜你喜欢
          • 2013-04-14
          • 2012-08-14
          • 1970-01-01
          • 2010-11-20
          • 2014-11-19
          • 2013-03-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多