<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.types.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'zh',
  ),
  'this' => 
  array (
    0 => 'language.types.string.php',
    1 => 'String 字符串',
    2 => 'String 字符串',
  ),
  'up' => 
  array (
    0 => 'language.types.php',
    1 => '类型',
  ),
  'prev' => 
  array (
    0 => 'language.types.float.php',
    1 => 'Float 浮点型',
  ),
  'next' => 
  array (
    0 => 'language.types.numeric-strings.php',
    1 => '数字字符串',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'zh',
    'path' => 'language/types/string.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.types.string" class="sect1">
 <h2 class="title">String 字符串</h2>

 <p class="para">
  一个字符串 <span class="type"><a href="language.types.string.php" class="type string">string</a></span> 就是由一系列的字符组成，其中每个字符等同于一个字节。这意味着
  PHP 只能支持 256 的字符集，因此不支持 Unicode 。详见<a href="language.types.string.php#language.types.string.details" class="link">字符串类型详解</a>。
 </p>

 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <span class="simpara">
   在 32 位版本中，<span class="type"><a href="language.types.string.php" class="type string">string</a></span> 最大可以达到 2GB（最多 2147483647 字节）。
  </span>
 </p></blockquote>

 <div class="sect2" id="language.types.string.syntax">
  <h3 class="title">语法</h3>

  <p class="para">
   一个字符串可以用 4 种方式表达：
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <a href="language.types.string.php#language.types.string.syntax.single" class="link">单引号</a>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <a href="language.types.string.php#language.types.string.syntax.double" class="link">双引号</a>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <a href="language.types.string.php#language.types.string.syntax.heredoc" class="link">heredoc 语法结构</a>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <a href="language.types.string.php#language.types.string.syntax.nowdoc" class="link">nowdoc 语法结构</a>
    </span>
   </li>
  </ul>

  <div class="sect3" id="language.types.string.syntax.single">
   <h4 class="title">单引号</h4>

   <p class="para">
    定义一个字符串的最简单的方法是用单引号把它包围起来（字符 <code class="literal">&#039;</code>）。
   </p>

   <p class="para">
    要表达一个单引号自身，需在它的前面加个反斜线（<code class="literal">\</code>）来转义。要表达一个反斜线自身，则用两个反斜线（<code class="literal">\\</code>）。其它任何方式的反斜线都会被当成反斜线本身：也就是说如果想使用其它转义序列例如
    <code class="literal">\r</code> 或者 <code class="literal">\n</code>，并不代表任何特殊含义，就单纯是这两个字符本身。
   </p>

   <blockquote class="note"><p><strong class="note">注意</strong>: 
    <span class="simpara">
     不像<a href="language.types.string.php#language.types.string.syntax.double" class="link">双引号</a>和
     <a href="language.types.string.php#language.types.string.syntax.heredoc" class="link">heredoc</a>
     语法结构，在单引号字符串中的<a href="language.variables.php" class="link">变量</a>和特殊字符的转义序列将<em>不会</em>被替换。
    </span>
   </p></blockquote>

   <div class="example" id="example-1">
    <p><strong>示例 #1 Syntax Variants</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'this is a simple string'</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 可以录入多行<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'You can also have embedded newlines in<br />strings this way as it is<br />okay to do'</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 输出：Arnold once said: "I'll be back"<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'Arnold once said: "I\'ll be back"'</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 输出：You deleted C:\*.*?<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'You deleted C:\\*.*?'</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 输出：You deleted C:\*.*?<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'You deleted C:\*.*?'</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 输出：This will not expand: \n a newline<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'This will not expand: \n a newline'</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 输出：Variables do not $expand $either<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'Variables do not $expand $either'</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>

  </div>

  <div class="sect3" id="language.types.string.syntax.double">
   <h4 class="title">双引号</h4>

   <p class="para">
    如果字符串是包围在双引号（<code class="literal">&quot;</code>)）中， PHP 将对以下特殊的字符进行解析：
   </p>

   <table class="doctable table">
    <caption><strong>转义字符</strong></caption>

    
     <thead>
      <tr>
       <th>序列</th>
       <th>含义</th>
      </tr>

     </thead>


     <tbody class="tbody">
      <tr>
       <td><code class="literal">\n</code></td>
       <td>换行（ASCII 字符集中的 LF 或 0x0A (10)）</td>
      </tr>

      <tr>
       <td><code class="literal">\r</code></td>
       <td>回车（ASCII 字符集中的 CR 或 0x0D (13)）</td>
      </tr>

      <tr>
       <td><code class="literal">\t</code></td>
       <td>水平制表符（ASCII 字符集中的 HT 或 0x09 (9)）</td>
      </tr>

      <tr>
       <td><code class="literal">\v</code></td>
       <td>垂直制表符（ASCII 字符集中的 VT 或 0x0B (11)）</td>
      </tr>

      <tr>
       <td><code class="literal">\e</code></td>
       <td>Escape（ASCII 字符集中的 ESC 或 0x1B (27)）</td>
      </tr>

      <tr>
       <td><code class="literal">\f</code></td>
       <td>换页（ASCII 字符集中的 FF 或 0x0C (12)）</td>
      </tr>

      <tr>
       <td><code class="literal">\\</code></td>
       <td>反斜线</td>
      </tr>

      <tr>
       <td><code class="literal">\$</code></td>
       <td>美元标记</td>
      </tr>

      <tr>
       <td><code class="literal">\&quot;</code></td>
       <td>双引号</td>
      </tr>

      <tr>
       <td><code class="literal">\[0-7]{1,3}</code></td>
       <td>
        八进制：匹配正则表达式序列 <code class="literal">[0-7]{1,3}</code> 的是八进制表示法的字符序列（比如
        <code class="literal">&quot;\101&quot; === &quot;A&quot;</code>），会静默溢出以适应一个字节（例如 <code class="literal">&quot;\400&quot; === &quot;\000&quot;</code>）
       </td>
      </tr>

      <tr>
       <td><code class="literal">\x[0-9A-Fa-f]{1,2}</code></td>
       <td>
        十六进制：匹配正则表达式序列 <code class="literal">[0-9A-Fa-f]{1,2}</code> 的是十六进制表示法的一个字符（比如
        <code class="literal">&quot;\x41&quot; === &quot;A&quot;</code>）
       </td>
      </tr>

      <tr>
       <td><code class="literal">\u{[0-9A-Fa-f]+}</code></td>
       <td>
        Unicode：匹配正则表达式 <code class="literal">[0-9A-Fa-f]+</code> 的字符序列是 unicode 码位，该码位能作为
        UTF-8 的表达方式输出字符串。序列中必须包含大括号。例如 <code class="literal">&quot;\u{41}&quot; === &quot;A&quot;</code>
       </td>
      </tr>

     </tbody>
    
   </table>


   <p class="para">
    和单引号字符串一样，转义任何其它字符都会导致反斜线被显示出来。
   </p>

   <p class="para">
    用双引号定义的字符串最重要的特征是变量会被解析，详见<a href="language.types.string.php#language.types.string.parsing" class="link">变量插值</a>。
   </p>
  </div>
  
  <div class="sect3" id="language.types.string.syntax.heredoc">
   <h4 class="title">Heredoc 结构</h4>

   <p class="simpara">
    第三种表达字符串的方法是用 heredoc
    句法结构：<code class="literal">&lt;&lt;&lt;</code>。在该运算符之后要提供一个标识符，然后换行。接下来是字符串
    <span class="type"><a href="language.types.string.php" class="type string">string</a></span> 本身，最后要用前面定义的标识符作为结束标志。
   </p>

   <p class="simpara">
    结束标识符可以使用空格或制表符（tab）缩进，此时文档字符串会删除所有缩进。
    在 PHP 7.3.0 之前的版本中，结束时所引用的标识符<em>必须</em>在该行的第一列。
    </p>
    <p class="simpara">
    而且，标识符的命名也要像其它标签一样遵守
    PHP 的规则：只能包含字母、数字和下划线，并且必须以字母和下划线作为开头。
   </p>

   <div class="example" id="example-2">
    <p><strong>示例 #2 PHP 7.3.0 之后的基础 Heredoc 示例</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// 无缩进<br /></span><span style="color: #007700">echo &lt;&lt;&lt;END<br /></span><span style="color: #DD0000">      a<br />     b<br />    c<br />\n<br /></span><span style="color: #007700">END;<br /></span><span style="color: #FF8000">// 4 空格缩进<br /></span><span style="color: #007700">echo &lt;&lt;&lt;END<br /></span><span style="color: #DD0000">      a<br />     b<br />    c<br /></span><span style="color: #007700">    END;</span></span></code></div>
    </div>

    <div class="example-contents"><p>以上示例在 PHP 7.3 中的输出：</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
      a
     b
    c
  a
 b
c
</pre></div>
    </div>
   </div>

   <p class="simpara">
    如果结束标识符的缩进超过内容的任何一行的缩进，则将抛出 <span class="classname"><a href="class.parseerror.php" class="classname">ParseError</a></span> 异常：
   </p>

   <div class="example" id="example-3">
    <p><strong>示例 #3 结束标识符的缩进不能超过正文的任何一行</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo &lt;&lt;&lt;END<br /></span><span style="color: #DD0000">  a<br /> b<br />c<br /></span><span style="color: #007700">   END;</span></span></code></div>
    </div>

    <div class="example-contents"><p>以上示例在 PHP 7.3 中的输出：</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Parse error: Invalid body indentation level (expecting an indentation level of at least 3) in example.php on line 4
</pre></div>
    </div>
   </div>

   <p class="simpara">
    制表符也可以缩进结束标识符，但是，关于缩进结束标识符和内容，
    制表符和空格<em>不能</em>混合使用。在以上任何情况下，
    将会抛出 <span class="classname"><a href="class.parseerror.php" class="classname">ParseError</a></span> 异常。

    之所以包含这些空白限制，是因为混合制表符和空格来缩进不利于易读性。
   </p>

   <div class="example" id="example-4">
    <p><strong>示例 #4 内容（空白）和结束标识符的不同缩进</strong></p>
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// 以下所有代码都不起作用。<br />// 正文（空格）和结束标记（制表符），不同的缩进<br /></span><span style="color: #007700">{<br />    echo &lt;&lt;&lt;END<br /></span><span style="color: #DD0000">     a<br /></span><span style="color: #007700">        END;<br />}<br /></span><span style="color: #FF8000">// 在正文中混合空格和制表符<br /></span><span style="color: #007700">{<br />    echo &lt;&lt;&lt;END<br /></span><span style="color: #DD0000">        a<br /></span><span style="color: #007700">     END;<br />}<br /></span><span style="color: #FF8000">// 在结束标记中混合空格和制表符<br /></span><span style="color: #007700">{<br />    echo &lt;&lt;&lt;END<br /></span><span style="color: #DD0000">          a<br /></span><span style="color: #007700">         END;<br />}</span></span></code></div>
    </div>

    <div class="example-contents"><p>以上示例在 PHP 7.3 中的输出：</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Parse error: Invalid indentation - tabs and spaces cannot be mixed in example.php line 8
</pre></div>
    </div>
   </div>

   <p class="simpara">
    内容字符串的结束标识符后面不需要跟分号或者换行符。
    例如，从 PHP 7.3.0 开始允许以下代码：
   </p>

   <div class="example" id="example-5">
    <p><strong>示例 #5 在结束标识符后继续表达式</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$values </span><span style="color: #007700">= [&lt;&lt;&lt;END<br /></span><span style="color: #DD0000">a<br />  b<br />    c<br /></span><span style="color: #007700">END, </span><span style="color: #DD0000">'d e f'</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$values</span><span style="color: #007700">);</span></span></code></div>
    </div>

    <div class="example-contents"><p>以上示例在 PHP 7.3 中的输出：</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
array(2) {
  [0] =&gt;
  string(11) &quot;a
  b
    c&quot;
  [1] =&gt;
  string(5) &quot;d e f&quot;
}
</pre></div>
    </div>
   </div>

   <div class="warning"><strong class="warning">警告</strong>
    <p class="simpara">
     如果在某一行的开头找到了结束标识符，那么不管它是否是另外一个单词的一部分，
     它都可能看作结束标识符并引起 <span class="classname"><a href="class.parseerror.php" class="classname">ParseError</a></span>。
    </p>

    <div class="example" id="example-6">
     <p><strong>示例 #6 字符串内容中的结束标识符往往会导致 ParseError</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$values </span><span style="color: #007700">= [&lt;&lt;&lt;END<br /></span><span style="color: #DD0000">a<br />b<br /></span><span style="color: #007700">END </span><span style="color: #0000BB">ING<br />END</span><span style="color: #007700">, </span><span style="color: #DD0000">'d e f'</span><span style="color: #007700">];</span></span></code></div>
     </div>

     <div class="example-contents"><p>以上示例在 PHP 7.3 中的输出：</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Parse error: syntax error, unexpected identifier &quot;ING&quot;, expecting &quot;]&quot; in example.php on line 5
</pre></div>
     </div>
    </div>

    <p class="simpara">
     为了避免这个问题，遵循以下简单的规则较为安全：
     <em>不要选择一个出现在文本主体中的单词作为结束标识符</em>。
    </p>

   </div>
   
   <div class="warning"><strong class="warning">警告</strong>
    <p class="simpara">
     在 PHP 7.3.0 之前，请务必注意，带有结束标识符的行不能包含除
     (<code class="literal">;</code>)外的任何其他字符。
     这意味着标识符<em>不能缩进</em>，分号的前后也不能有任何空白或制表符。更重要的是结束标识符的前面必须是个被本地操作系统认可的换行，比如在
     UNIX 和 macOS 系统中是 <code class="literal">\n</code>，而结束定界符之后也必须紧跟一个换行。
    </p>

    <p class="simpara">
     如果不遵守该规则导致结束标识不“干净”，PHP
     将认为它不是结束标识符而继续寻找。如果在文件结束前也没有找到一个正确的结束标识符，PHP
     将会在最后一行产生一个解析错误。
    </p>

    <div class="example" id="example-7">
     <p><strong>示例 #7 PHP 7.3.0 之前的错误示例</strong></p>
     <div class="example-contents">
      
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">foo </span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$bar </span><span style="color: #007700">= &lt;&lt;&lt;EOT<br /></span><span style="color: #DD0000">bar<br /></span><span style="color: #007700">    EOT;<br />}<br /></span><span style="color: #FF8000">// 不能缩进标识符<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    <div class="example" id="example-8">
     <p><strong>示例 #8 在 PHP 7.3.0 之前有效示例</strong></p>
     <div class="example-contents">
      
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">foo </span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$bar </span><span style="color: #007700">= &lt;&lt;&lt;EOT<br /></span><span style="color: #DD0000">bar<br /></span><span style="color: #007700">EOT;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>

    <p class="para">
     Heredocs 结构不能用来初始化类的属性。
    </p>
   </div>

   <p class="para">
    Heredoc 结构就象是没有双引号的 <span class="type"><a href="language.types.string.php" class="type string">string</a></span>，这就是说在 heredoc
    结构中单引号不用被转义，但是上文中列出的转义序列还可以使用。变量将被替换，但在 heredoc
    结构中含有复杂的变量时要像 <span class="type"><a href="language.types.string.php" class="type string">string</a></span> 一样格外小心。
   </p>

   <div class="example" id="example-9"> 
    <p><strong>示例 #9 Heredoc 结构的字符串示例</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$str </span><span style="color: #007700">= &lt;&lt;&lt;EOD<br /></span><span style="color: #DD0000">Example of string<br />spanning multiple lines<br />using heredoc syntax.<br /></span><span style="color: #007700">EOD;<br /><br /></span><span style="color: #FF8000">/* 含有变量的更复杂示例 */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">foo<br /></span><span style="color: #007700">{<br />    var </span><span style="color: #0000BB">$foo</span><span style="color: #007700">;<br />    var </span><span style="color: #0000BB">$bar</span><span style="color: #007700">;<br /><br />    function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo </span><span style="color: #007700">= </span><span style="color: #DD0000">'Foo'</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'Bar1'</span><span style="color: #007700">, </span><span style="color: #DD0000">'Bar2'</span><span style="color: #007700">, </span><span style="color: #DD0000">'Bar3'</span><span style="color: #007700">);<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$foo </span><span style="color: #007700">= new </span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$name </span><span style="color: #007700">= </span><span style="color: #DD0000">'MyName'</span><span style="color: #007700">;<br /><br />echo &lt;&lt;&lt;EOT<br /></span><span style="color: #DD0000">My name is "</span><span style="color: #0000BB">$name</span><span style="color: #DD0000">". I am printing some </span><span style="color: #0000BB">$foo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo</span><span style="color: #DD0000">.<br />Now, I am printing some </span><span style="color: #007700">{</span><span style="color: #0000BB">$foo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]}</span><span style="color: #DD0000">.<br />This should print a capital 'A': \x41<br /></span><span style="color: #007700">EOT;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <p class="para">以上示例会输出：</p>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
My name is &quot;MyName&quot;. I am printing some Foo.
Now, I am printing some Bar2.
This should print a capital &#039;A&#039;: A</pre></div>
   </div>

   <p class="para">
    也可以把 Heredoc 结构用在函数参数中来传递数据：
   </p>

   <div class="example" id="example-10">
    <p><strong>示例 #10 Heredoc 结构在参数中的示例</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(array(&lt;&lt;&lt;EOD<br /></span><span style="color: #DD0000">foobar!<br /></span><span style="color: #007700">EOD<br />));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>

   <p class="para">
    可以用 Heredoc 结构来初始化静态变量和类的属性和常量：
   </p>

   <div class="example" id="example-11">
    <p><strong>示例 #11 使用 Heredoc 结构来初始化静态值</strong></p>
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// 静态变量<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br />{<br />    static </span><span style="color: #0000BB">$bar </span><span style="color: #007700">= &lt;&lt;&lt;LABEL<br /></span><span style="color: #DD0000">Nothing in here...<br /></span><span style="color: #007700">LABEL;<br />}<br /><br /></span><span style="color: #FF8000">// 类的常量、属性<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">foo<br /></span><span style="color: #007700">{<br />    const </span><span style="color: #0000BB">BAR </span><span style="color: #007700">= &lt;&lt;&lt;FOOBAR<br /></span><span style="color: #DD0000">Constant example<br /></span><span style="color: #007700">FOOBAR;<br /><br />    public </span><span style="color: #0000BB">$baz </span><span style="color: #007700">= &lt;&lt;&lt;FOOBAR<br /></span><span style="color: #DD0000">Property example<br /></span><span style="color: #007700">FOOBAR;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>

   <p class="para">
    还可以在 Heredoc 结构中用双引号来声明标识符：
   </p>

   <div class="example" id="example-12">
    <p><strong>示例 #12 在 heredoc 结构中使用双引号</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo &lt;&lt;&lt;"FOOBAR"<br /></span><span style="color: #DD0000">Hello World!<br /></span><span style="color: #007700">FOOBAR;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>

  </div>

  <div class="sect3" id="language.types.string.syntax.nowdoc">
   <h4 class="title">Nowdoc 结构</h4>

   <p class="para">
    就象 heredoc 结构类似于双引号字符串，Nowdoc 结构是类似于单引号字符串的。Nowdoc
    结构很象 heredoc 结构，但是 nowdoc
    中<em>不进行字符串插值</em>。这种结构很适合用于嵌入 PHP
    代码或其它大段文本而无需对其中的特殊字符进行转义。与 SGML 的
    <code class="literal">&lt;![CDATA[ ]]&gt;</code> 结构是用来声明大段的不用解析的文本类似，nowdoc 结构也有相同的特征。
   </p>

   <p class="para">
    一个 nowdoc 结构也用和 heredocs 结构一样的标记
    <code class="literal">&lt;&lt;&lt;</code>， 但是跟在后面的标识符要用单引号括起来，即
    <code class="literal">&lt;&lt;&lt;&#039;EOT&#039;</code>。Heredoc 结构的所有规则也同样适用于 nowdoc
    结构，尤其是结束标识符的规则。
   </p>

   <div class="example" id="example-13">
    <p><strong>示例 #13 Nowdoc 结构字符串示例</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo &lt;&lt;&lt;'EOD'<br /></span><span style="color: #DD0000">Example of string spanning multiple lines<br />using nowdoc syntax. Backslashes are always treated literally,<br />e.g. \\ and \'.<br /></span><span style="color: #007700">EOD;</span></span></code></div>
    </div>

    <div class="example-contents"><p>以上示例会输出：</p></div>
    <div class="example-contents screen">
     <div class="annotation-interactive cdata"><pre>
Example of string spanning multiple lines
using nowdoc syntax. Backslashes are always treated literally,
e.g. \\ and \&#039;.
</pre></div>
    </div>
   </div>

   <div class="example" id="example-14">
    <p><strong>示例 #14 含变量引用的 Nowdoc 字符串示例</strong></p>
    <div class="example-contents">
     <div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">/* 含有变量的更复杂的示例 */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">foo<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$foo</span><span style="color: #007700">;<br />    public </span><span style="color: #0000BB">$bar</span><span style="color: #007700">;<br /><br />    function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo </span><span style="color: #007700">= </span><span style="color: #DD0000">'Foo'</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'Bar1'</span><span style="color: #007700">, </span><span style="color: #DD0000">'Bar2'</span><span style="color: #007700">, </span><span style="color: #DD0000">'Bar3'</span><span style="color: #007700">);<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$foo </span><span style="color: #007700">= new </span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$name </span><span style="color: #007700">= </span><span style="color: #DD0000">'MyName'</span><span style="color: #007700">;<br /><br />echo &lt;&lt;&lt;'EOT'<br /></span><span style="color: #DD0000">My name is "$name". I am printing some $foo-&gt;foo.<br />Now, I am printing some {$foo-&gt;bar[1]}.<br />This should not print a capital 'A': \x41<br /></span><span style="color: #007700">EOT;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>以上示例会输出：</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
My name is &quot;$name&quot;. I am printing some $foo-&gt;foo.
Now, I am printing some {$foo-&gt;bar[1]}.
This should not print a capital &#039;A&#039;: \x41</pre></div>
   </div>
 </div>

    <div class="example" id="example-15">
     <p><strong>示例 #15 静态数据的示例</strong></p>
     <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">foo </span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$bar </span><span style="color: #007700">= &lt;&lt;&lt;'EOT'<br /></span><span style="color: #DD0000">bar<br /></span><span style="color: #007700">EOT;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>

   <blockquote class="note"><p><strong class="note">注意</strong>: 
    <p class="para">
     Nowdoc 结构是在 PHP 5.3.0 中加入的。
    </p>
   </p></blockquote>

  </div>

  <div class="sect3" id="language.types.string.parsing">
   <h4 class="title">字符串插值</h4>

   <p class="simpara">
    当<span class="type">字符串</span>用双引号或 heredoc 结构定义时，其中的<a href="language.variables.php" class="link">变量</a>可以进行替换。
   </p>

   <p class="simpara">
    这里共有两种语法规则：一种<a href="language.types.string.php#language.types.string.parsing.basic" class="link">基本</a>规则，一种<a href="language.types.string.php#language.types.string.parsing.advanced" class="link">高级</a>规则。基本的语法规则是最常用和最方便的，它可以用最少的代码在一个
    <span class="type"><a href="language.types.string.php" class="type string">string</a></span> 中嵌入一个变量，一个 <span class="type"><a href="language.types.array.php" class="type array">array</a></span> 的值，或一个 <span class="type"><a href="language.types.object.php" class="type object">object</a></span> 的属性。
   </p>

   <div class="sect4" id="language.types.string.parsing.basic">
    <h5 class="title">基本语法</h5>
    <p class="simpara">
     如果遇到一个美元符号（<code class="literal">$</code>），后面的字符会被解释为变量名，然后替换为变量的值。
    </p>
    <div class="example" id="example-16">
     <p><strong>示例 #16 String Interpolation</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$juice </span><span style="color: #007700">= </span><span style="color: #DD0000">"apple"</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"He drank some </span><span style="color: #0000BB">$juice</span><span style="color: #DD0000"> juice." </span><span style="color: #007700">. </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     <div class="example-contents"><p>以上示例会输出：</p></div>
     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
He drank some apple juice.
</pre></div>
     </div>
    </div>

    <p class="simpara">
     从形式上讲，基本变量替换语法的结构如下：
    </p>
    <div class="informalexample">
     <div class="example-contents">
<div class="annotation-interactive cdata"><pre>
string-variable::
     variable-name   (offset-or-property)?
   | ${   expression   }

offset-or-property::
     offset-in-string
   | property-in-string

offset-in-string::
     [   name   ]
   | [   variable-name   ]
   | [   integer-literal   ]

property-in-string::
     -&gt;  name

variable-name::
     $   name

name::
     [a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*

</pre></div>
     </div>

    </div>

    <div class="warning"><strong class="warning">警告</strong>
     <p class="para">
      <code class="literal">${ expression }</code> 语法从 PHP 8.2.0 开始被弃用，因为它可能被解释为
      <a href="language.variables.variable.php" class="link">可变变量</a>：
      <div class="informalexample">
       <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">const </span><span style="color: #0000BB">foo </span><span style="color: #007700">= </span><span style="color: #DD0000">'bar'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$foo </span><span style="color: #007700">= </span><span style="color: #DD0000">'foo'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$bar </span><span style="color: #007700">= </span><span style="color: #DD0000">'bar'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #DD0000">"</span><span style="color: #007700">${</span><span style="color: #0000BB">foo</span><span style="color: #007700">}</span><span style="color: #DD0000">"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #DD0000">"</span><span style="color: #007700">${(</span><span style="color: #0000BB">foo</span><span style="color: #007700">)}</span><span style="color: #DD0000">"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
       </div>

       <p class="para">以上示例在 PHP 8.2 中的输出：</p>
       <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Deprecated: Using ${var} in strings is deprecated, use {$var} instead in file on line 6

Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead in file on line 9
string(3) &quot;foo&quot;
string(3) &quot;bar&quot;
</pre></div>
       </div>
       <p class="para">以上示例会输出：</p>
       <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
string(3) &quot;foo&quot;
string(3) &quot;bar&quot;
</pre></div>
       </div>
      </div>
      <a href="language.types.string.php#language.types.string.parsing.advanced" class="link">高级</a> 字符串插值语法应该被使用。
     </p>
    </div>

    <blockquote class="note"><p><strong class="note">注意</strong>: 
     <span class="simpara">
      如果无法形成有效的变量名，美元符号会保持原样。
     </span>
     <div class="informalexample">
      <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"No interpolation $  has happened\n"</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"No interpolation $\n has happened\n"</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"No interpolation $2 has happened\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      <p class="para">以上示例会输出：</p>
      <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
No interpolation $  has happened
No interpolation $
 has happened
No interpolation $2 has happened
</pre></div>
      </div>
     </div>
    </p></blockquote>

    <div class="example" id="example-17">
     <p><strong>示例 #17 插值数组或属性的第一个维度值</strong></p>
     <div class="example-contents">
      <div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$juices </span><span style="color: #007700">= array(</span><span style="color: #DD0000">"apple"</span><span style="color: #007700">, </span><span style="color: #DD0000">"orange"</span><span style="color: #007700">, </span><span style="color: #DD0000">"string_key" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"purple"</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #DD0000">"He drank some </span><span style="color: #0000BB">$juices</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]</span><span style="color: #DD0000"> juice."</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"He drank some </span><span style="color: #0000BB">$juices</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]</span><span style="color: #DD0000"> juice."</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"He drank some </span><span style="color: #0000BB">$juices</span><span style="color: #007700">[</span><span style="color: #0000BB">string_key</span><span style="color: #007700">]</span><span style="color: #DD0000"> juice."</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br />class </span><span style="color: #0000BB">A </span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$s </span><span style="color: #007700">= </span><span style="color: #DD0000">"string"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$o </span><span style="color: #007700">= new </span><span style="color: #0000BB">A</span><span style="color: #007700">();<br /><br />echo </span><span style="color: #DD0000">"Object value: </span><span style="color: #0000BB">$o</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">s</span><span style="color: #DD0000">."</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     <div class="example-contents"><p>以上示例会输出：</p></div>
     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
He drank some apple juice.
He drank some orange juice.
He drank some purple juice.
Object value: string.
</pre></div>
     </div>
    </div>

    <blockquote class="note"><p><strong class="note">注意</strong>: 
     <span class="simpara">
      数组键必须是无引号的，因此不能用基本语法将常量作为键来引用。使用
      <a href="language.types.string.php#language.types.string.parsing.advanced" class="link">高级</a>
      语法代替。
     </span>
    </p></blockquote>

    <p class="simpara">
     从 PHP 7.1.0 起，还支持<em>负</em>数字索引。
    </p>

    <div class="example" id="example-18"><p><strong>示例 #18 负数索引</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$string </span><span style="color: #007700">= </span><span style="color: #DD0000">'string'</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"The character at index -2 is </span><span style="color: #0000BB">$string</span><span style="color: #007700">[-</span><span style="color: #0000BB">2</span><span style="color: #007700">]</span><span style="color: #DD0000">."</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$string</span><span style="color: #007700">[-</span><span style="color: #0000BB">3</span><span style="color: #007700">] = </span><span style="color: #DD0000">'o'</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"Changing the character at index -3 to o gives </span><span style="color: #0000BB">$string</span><span style="color: #DD0000">."</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     <div class="example-contents"><p>以上示例会输出：</p></div>
     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
The character at index -2 is n.
Changing the character at index -3 to o gives strong.
</pre></div>
     </div>
    </div>

    <p class="simpara">
     对于更复杂的情况，可以使用 <a href="language.types.string.php#language.types.string.parsing.advanced" class="link">高级</a>
     语法。
    </p>
   </div>


   <div class="sect4" id="language.types.string.parsing.advanced">
    <h5 class="title">高级（大括号）语法</h5>

    <p class="simpara">
     高级语法允许使用任意访问器对<em>变量</em>进行插值。
    </p>

    <p class="simpara">
     任何标量变量、数组元素或对象属性（<span class="modifier">static</span> 或非
     <span class="modifier">static</span>）都可以通过这种语法进行插值。表达式的写法和
     在<span class="type"><a href="language.types.string.php" class="type string">string</a></span>之外的写法一样，然后用大括号<code class="literal">{</code>和
     <code class="literal">}</code>包围。由于<code class="literal">{</code>不能被转义，所以这种语法只有在
     紧跟在<code class="literal">{</code>后面的<code class="literal">$</code>才会被识别。要得到一个字面的
     <code class="literal">{$</code>，需要用<code class="literal">{\$</code>。以下是一些例子：
    </p>

    <div class="example" id="example-19">
     <p><strong>示例 #19 Curly Syntax</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">const </span><span style="color: #0000BB">DATA_KEY </span><span style="color: #007700">= </span><span style="color: #DD0000">'const-key'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$great </span><span style="color: #007700">= </span><span style="color: #DD0000">'fantastic'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$arr </span><span style="color: #007700">= [<br />    </span><span style="color: #DD0000">'1'</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'2'</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'3'</span><span style="color: #007700">,<br />    [</span><span style="color: #0000BB">41</span><span style="color: #007700">, </span><span style="color: #0000BB">42</span><span style="color: #007700">, </span><span style="color: #0000BB">43</span><span style="color: #007700">],<br />    </span><span style="color: #DD0000">'key' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'Indexed value'</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'const-key' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'Key with minus sign'</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'foo' </span><span style="color: #007700">=&gt; [</span><span style="color: #DD0000">'foo1'</span><span style="color: #007700">, </span><span style="color: #DD0000">'foo2'</span><span style="color: #007700">, </span><span style="color: #DD0000">'foo3'</span><span style="color: #007700">]<br />];<br /><br /></span><span style="color: #FF8000">// 无效，输出 This is { fantastic}<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"This is { </span><span style="color: #0000BB">$great</span><span style="color: #DD0000">}"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 有效，输出 This is fantastic<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"This is </span><span style="color: #007700">{</span><span style="color: #0000BB">$great</span><span style="color: #007700">}</span><span style="color: #DD0000">"</span><span style="color: #007700">;<br /><br />class </span><span style="color: #0000BB">Square </span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$width</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">int $width</span><span style="color: #007700">) { </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">width </span><span style="color: #007700">= </span><span style="color: #0000BB">$width</span><span style="color: #007700">; }<br />}<br /><br /></span><span style="color: #0000BB">$square </span><span style="color: #007700">= new </span><span style="color: #0000BB">Square</span><span style="color: #007700">(</span><span style="color: #0000BB">5</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// 有效<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"This square is </span><span style="color: #007700">{</span><span style="color: #0000BB">$square</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">width</span><span style="color: #007700">}</span><span style="color: #DD0000">00 centimeters wide."</span><span style="color: #007700">;<br /><br /><br /></span><span style="color: #FF8000">// 有效，引用 key 仅使用花括号语法时有效<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"This works: </span><span style="color: #007700">{</span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #DD0000">'key'</span><span style="color: #007700">]}</span><span style="color: #DD0000">"</span><span style="color: #007700">;<br /><br /><br /></span><span style="color: #FF8000">// 有效<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"This works: </span><span style="color: #007700">{</span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">3</span><span style="color: #007700">][</span><span style="color: #0000BB">2</span><span style="color: #007700">]}</span><span style="color: #DD0000">"</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"This works: </span><span style="color: #007700">{</span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">DATA_KEY</span><span style="color: #007700">]}</span><span style="color: #DD0000">"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 使用多维数组时，在字符串内部时，始终使用括号括住数组<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"This works: </span><span style="color: #007700">{</span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #DD0000">'foo'</span><span style="color: #007700">][</span><span style="color: #0000BB">2</span><span style="color: #007700">]}</span><span style="color: #DD0000">"</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"This works: </span><span style="color: #007700">{</span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">values</span><span style="color: #007700">[</span><span style="color: #0000BB">3</span><span style="color: #007700">]-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">}</span><span style="color: #DD0000">"</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"This works: </span><span style="color: #007700">{</span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">$staticProp</span><span style="color: #007700">}</span><span style="color: #DD0000">"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 无效，输出 C:\directory\{fantastic}.txt<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"C:\directory\{</span><span style="color: #0000BB">$great</span><span style="color: #DD0000">}.txt"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 有效，输出 C:\directory\fantastic.txt<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"C:\\directory\\</span><span style="color: #007700">{</span><span style="color: #0000BB">$great</span><span style="color: #007700">}</span><span style="color: #DD0000">.txt"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>

    <blockquote class="note"><p><strong class="note">注意</strong>: 
     <span class="simpara">
      由于该语法允许任意表达式，因此可以在高级语法中使用
      <a href="language.variables.variable.php" class="link">可变变量</a>。
     </span>
    </p></blockquote>
   </div>
  </div>
  
  <div class="sect3" id="language.types.string.substr">
   <h4 class="title">存取和修改字符串中的字符</h4>

   <p class="para">
    <span class="type"><a href="language.types.string.php" class="type string">string</a></span> 中的字符可以通过一个从 0 开始的下标，用类似
    <span class="type"><a href="language.types.array.php" class="type array">array</a></span> 结构中的方括号包含对应的数字来访问和修改，比如
    <var class="varname">$str[42]</var>。可以把 <span class="type"><a href="language.types.string.php" class="type string">string</a></span>
    当成字符组成的 <span class="type"><a href="language.types.array.php" class="type array">array</a></span>。函数 <span class="function"><a href="function.substr.php" class="function">substr()</a></span> 和
    <span class="function"><a href="function.substr-replace.php" class="function">substr_replace()</a></span> 可用于操作多于一个字符的情况。
   </p>

   <blockquote class="note"><p><strong class="note">注意</strong>: 
    <span class="simpara">
     从 PHP 7.1.0 开始，还支持 string 负偏移量。从 string 尾部到指定位置的偏移量。
     以前，负偏移量读取时（返回空 string）会发出 <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong>， 
     写入时（string 保持不变）会发出 <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong>。
    </span>
   </p></blockquote>

   <blockquote class="note"><p><strong class="note">注意</strong>: 
    <span class="simpara">
     PHP 8.0.0 之前, 出于同样的目的，可以使用大括号访问 <span class="type"><a href="language.types.string.php" class="type string">string</a></span>，例如 <var class="varname">$str{42}</var>。
     从 PHP 7.4.0 起，此大括号语法被弃用，自 PHP 8.0.0 开始不再受支持。
    </span>
   </p></blockquote>

   <div class="warning"><strong class="warning">警告</strong>
    <p class="simpara">
     用超出字符串长度的下标写入将会拉长该字符串并以空格填充。非整数类型下标会被转换成整数。非法下标类型会产生一个
     <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> 级别错误。
     写入时只用到了赋值字符串的第一个字符。
     PHP 7.1.0 开始，用空字符串赋值会导致 fatal 错误；在之前赋给的值是
     NULL 字符。
    </p>
   </div>

   <div class="warning"><strong class="warning">警告</strong>
    <p class="simpara">
     PHP 的字符串在内部是字节组成的数组。因此用花括号访问或修改字符串对多字节字符集很不安全。仅应对单字节编码例如
     ISO-8859-1 的字符串进行此类操作。
    </p>
   </div>

   <blockquote class="note"><p><strong class="note">注意</strong>: 
    <span class="simpara">
     从 PHP 7.1.0 开始，对空字符串应用空索引运算符会引发致命错误。
     以前是空字符串会被静默转为数组。
    </span>
   </p></blockquote>

   <div class="example" id="example-20">
    <p><strong>示例 #20 一些字符串示例</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// 取得字符串的第一个字符<br /></span><span style="color: #0000BB">$str </span><span style="color: #007700">= </span><span style="color: #DD0000">'This is a test.'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$first </span><span style="color: #007700">= </span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$first</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// 取得字符串的第三个字符<br /></span><span style="color: #0000BB">$third </span><span style="color: #007700">= </span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #0000BB">2</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$third</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// 取得字符串的最后一个字符<br /></span><span style="color: #0000BB">$str </span><span style="color: #007700">= </span><span style="color: #DD0000">'This is still a test.'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$last </span><span style="color: #007700">= </span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">)-</span><span style="color: #0000BB">1</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$last</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// 修改字符串的最后一个字符<br /></span><span style="color: #0000BB">$str </span><span style="color: #007700">= </span><span style="color: #DD0000">'Look at the sea'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">)-</span><span style="color: #0000BB">1</span><span style="color: #007700">] = </span><span style="color: #DD0000">'e'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>

   <p class="para">
    字符串下标必须为整数或可转换为整数的字符串，否则会发出警告。之前类似
    <code class="literal">&quot;foo&quot;</code> 的下标会无声地转换成 <code class="literal">0</code>。
   </p>

   <div class="example" id="example-21">
    <p><strong>示例 #21 字符串无效下标的例子</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$str </span><span style="color: #007700">= </span><span style="color: #DD0000">'abc'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$keys </span><span style="color: #007700">= [ </span><span style="color: #DD0000">'1'</span><span style="color: #007700">, </span><span style="color: #DD0000">'1.0'</span><span style="color: #007700">, </span><span style="color: #DD0000">'x'</span><span style="color: #007700">, </span><span style="color: #DD0000">'1x' </span><span style="color: #007700">];<br /><br />foreach (</span><span style="color: #0000BB">$keys </span><span style="color: #007700">as </span><span style="color: #0000BB">$keyToTry</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(isset(</span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #0000BB">$keyToTry</span><span style="color: #007700">]));<br /><br />    try {<br />        </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #0000BB">$keyToTry</span><span style="color: #007700">]);<br />    } catch (</span><span style="color: #0000BB">TypeError $e</span><span style="color: #007700">) {<br />        echo </span><span style="color: #0000BB">$e</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getMessage</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />    }<br /><br />    echo </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>以上示例会输出：</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
bool(true)
string(1) &quot;b&quot;

bool(false)
Cannot access offset of type string on string

bool(false)
Cannot access offset of type string on string

bool(false)

Warning: Illegal string offset &quot;1x&quot; in Standard input code on line 10
string(1) &quot;b&quot;
</pre></div>
    </div>
   </div>

   <blockquote class="note"><p><strong class="note">注意</strong>: 
    <p class="para">
     用 <code class="literal">[]</code> 或 <code class="literal">{}</code>
     访问任何其它类型（不包括数组或具有相应接口的对象实现）的变量只会无声地返回 <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>。
    </p>
   </p></blockquote>

   <blockquote class="note"><p><strong class="note">注意</strong>: 
    <p class="para">
     可以直接在字符串原型中用
     <code class="literal">[]</code> 或 <code class="literal">{}</code> 访问字符。
    </p>
   </p></blockquote>

   <blockquote class="note"><p><strong class="note">注意</strong>: 
    <p class="para">
     PHP 7.4 中弃用在字符串字面量中使用 <code class="literal">{}</code> 来访问字符。
     PHP 8.0 已移除。
    </p>
   </p></blockquote>
  </div>
 </div>

 <div class="sect2" id="language.types.string.useful-funcs">
  <h3 class="title">有用的函数和运算符</h3>

  <p class="para">
   字符串可以用 &#039;.&#039;（点）运算符连接起来，注意
   &#039;+&#039;（加号）运算符<em>没有</em>这个功能。更多信息参考<a href="language.operators.string.php" class="link">字符串运算符</a>。
  </p>

  <p class="para">
   对于 <span class="type"><a href="language.types.string.php" class="type string">string</a></span> 的操作有很多有用的函数。
  </p>

  <p class="simpara">
   可以参考<a href="ref.strings.php" class="link">字符串函数</a>了解大部分函数，高级的查找与替换功能可以参考
   <a href="ref.pcre.php" class="link">Perl 兼容正则表达式函数</a>。
  </p>

  <p class="simpara">
   另外还有 <a href="ref.url.php" class="link">URL
   字符串函数</a>，也有加密／解密字符串的函数（<a href="ref.sodium.php" class="link">Sodium</a> 和
   <a href="ref.hash.php" class="link">Hash</a>）。
  </p>

  <p class="simpara">
   最后，可以参考<a href="ref.ctype.php" class="link">字符类型函数</a>。
  </p>
 </div>

 <div class="sect2" id="language.types.string.casting">
  <h3 class="title">转换成字符串</h3>
  
  <p class="para">
   一个值可以通过在其前面加上 <code class="literal">(string)</code> 或用 <span class="function"><a href="function.strval.php" class="function">strval()</a></span>
   函数来转变成字符串。在一个需要字符串的表达式中，会自动转换为
   <span class="type"><a href="language.types.string.php" class="type string">string</a></span>。这发生在当使用 <span class="function"><a href="function.echo.php" class="function">echo</a></span> 或 <span class="function"><a href="function.print.php" class="function">print</a></span>
   函数，或当变量与 <span class="type"><a href="language.types.string.php" class="type string">string</a></span> 进行比较的时候。<a href="language.types.php" class="link">类型</a>和<a href="language.types.type-juggling.php" class="link">类型转换</a>可以更好的解释下面的事情，也可参考函数
   <span class="function"><a href="function.settype.php" class="function">settype()</a></span>。
  </p>
  
  <p class="para">
   一个布尔值 <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> 的 <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> 被转换成 <span class="type"><a href="language.types.string.php" class="type string">string</a></span> 的
   <code class="literal">&quot;1&quot;</code>。<span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> 的 <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> 被转换成
   <code class="literal">&quot;&quot;</code>（空字符串）。这种转换可以在 <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>
   和 <span class="type"><a href="language.types.string.php" class="type string">string</a></span> 之间相互进行。
  </p>

  <p class="para"> 
   一个整数 <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> 或浮点数 <span class="type"><a href="language.types.float.php" class="type float">float</a></span> 被转换为数字的字面样式的
   <span class="type"><a href="language.types.string.php" class="type string">string</a></span>（包括 <span class="type"><a href="language.types.float.php" class="type float">float</a></span>
   中的指数部分）。使用指数计数法的浮点数（<code class="literal">4.1E+6</code>）也可转换。
  </p>

  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="para">
    PHP 8.0.0 起，十进制小数点字符都是一个句号（<code class="literal">.</code>）。
    而在此之前的版本，在脚本的区域（category LC_NUMERIC）
    中定义了十进制小数点字符。参见 <span class="function"><a href="function.setlocale.php" class="function">setlocale()</a></span>。
   </p>
  </p></blockquote>

  <p class="para">
   数组 <span class="type"><a href="language.types.array.php" class="type array">array</a></span> 总是转换成字符串
   <code class="literal">&quot;Array&quot;</code>，因此，<span class="function"><a href="function.echo.php" class="function">echo</a></span> 和 
   <span class="function"><a href="function.print.php" class="function">print</a></span> 无法显示出该<span class="type">数组</span>的内容。要显示某个单元，可以用 
   <code class="literal">echo $arr[&#039;foo&#039;]</code> 这种结构。要显示整个数组内容见下文。
  </p>

  <p class="para">
   必须使用魔术方法 <a href="language.oop5.magic.php" class="link">__toString</a>
   才能将 <span class="type"><a href="language.types.object.php" class="type object">object</a></span> 转换为 <span class="type"><a href="language.types.string.php" class="type string">string</a></span>。
  </p>

  <p class="para">
   资源 <span class="type"><a href="language.types.resource.php" class="type Resource">Resource</a></span> 总会被转变成 <code class="literal">&quot;Resource id #1&quot; </code>
   这种结构的字符串，其中的 <code class="literal">1</code> 是 PHP
   在运行时分配给该 <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> 的资源数字。
   虽然不应依赖此字符串的确切结构且该结构可能会更改，但在脚本执行的生命周期内（即一个
   Web 请求或 CLI 进程），该字符串对于给定的资源始终是唯一的，且不会被重复使用。
   要得到一个
   <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> 的类型，可以用函数 <span class="function"><a href="function.get-resource-type.php" class="function">get_resource_type()</a></span>。
  </p>

  <p class="para">
   <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> 总是被转变成空字符串。
  </p>
  
  <p class="para">
   如上面所说的，直接把 <span class="type"><a href="language.types.array.php" class="type array">array</a></span>，<span class="type"><a href="language.types.object.php" class="type object">object</a></span> 或 <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>
   转换成 <span class="type"><a href="language.types.string.php" class="type string">string</a></span> 不会得到除了其类型之外的任何有用信息。可以使用函数 
   <span class="function"><a href="function.print-r.php" class="function">print_r()</a></span> 和 <span class="function"><a href="function.var-dump.php" class="function">var_dump()</a></span> 列出这些类型的内容。
  </p>
  
  <p class="para">
   大部分的 PHP 值可以转变成 <span class="type"><a href="language.types.string.php" class="type string">string</a></span> 来永久保存，这被称作串行化，可以用函数
   <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span> 来实现。
  </p>

 </div>

 <div class="sect2" id="language.types.string.details">
  
  <h3 class="title">字符串类型详解</h3>
  
  <p class="para">
   PHP 中的 <span class="type"><a href="language.types.string.php" class="type string">string</a></span>
   的实现方式是一个由字节组成的数组再加上一个整数指明缓冲区长度。并无如何将字节转换成字符的信息，由程序员来决定。字符串由什么值来组成并无限制；特别的，其值为
   <code class="literal">0</code>（“NUL bytes”）的字节可以处于字符串任何位置（不过有几个函数，在本手册中被称为非“二进制安全”的，也许会把
   NUL 字节之后的数据全都忽略）。
  </p>
  <p class="para">
   字符串类型的此特性解释了为什么 PHP 中没有单独的“byte”类型 -
   已经用字符串来代替了。返回非文本值的函数 - 例如从网络套接字读取的任意数据
   - 仍会返回字符串。
  </p>
  <p class="para">
   由于 PHP 并不特别指明字符串的编码，那字符串到底是怎样编码的呢？例如字符串
   <code class="literal">&quot;á&quot;</code> 到底是等于
   <code class="literal">&quot;\xE1&quot;</code>（ISO-8859-1），<code class="literal">&quot;\xC3\xA1&quot;</code>（UTF-8，C
   form），<code class="literal">&quot;\x61\xCC\x81&quot;</code>（UTF-8，D
   form）还是任何其它可能的表达呢？答案是字符串会被按照该脚本文件相同的编码方式来编码。因此如果一个脚本的编码是
   ISO-8859-1，则其中的字符串也会被编码为 ISO-8859-1，以此类推。不过这并不适用于激活了 Zend Multibyte
   时；此时脚本可以是以任何方式编码的（明确指定或被自动检测）然后被转换为某种内部编码，然后字符串将被用此方式编码。注意脚本的编码有一些约束（如果激活了 Zend Multibyte 则是其内部编码）-
   这意味着此编码应该是 ASCII 的兼容超集，例如
   UTF-8 或 ISO-8859-1。不过要注意，依赖状态的编码其中相同的字节值可以用于首字母和非首字母而转换状态，这可能会造成问题。
  </p>
  <p class="para">
   当然了，要做到有用，操作文本的函数必须假定字符串是如何编码的。不幸的是，PHP
   关于此的函数有很多变种：
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     某些函数假定字符串是以单字节编码的，但并不需要将字节解释为特定的字符。例如
     <span class="function"><a href="function.substr.php" class="function">substr()</a></span>，<span class="function"><a href="function.strpos.php" class="function">strpos()</a></span>，<span class="function"><a href="function.strlen.php" class="function">strlen()</a></span> 和
     <span class="function"><a href="function.strcmp.php" class="function">strcmp()</a></span>。理解这些函数的另一种方法是它们作用于内存缓冲区，即按照字节和字节下标操作。
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     某些函数被传递入了字符串的编码方式，也可能会假定默认无此信息。例如
     <span class="function"><a href="function.htmlentities.php" class="function">htmlentities()</a></span> 和
     <a href="book.mbstring.php" class="link">mbstring</a> 扩展中的大部分函数。
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     其它函数使用了当前区域（见 <span class="function"><a href="function.setlocale.php" class="function">setlocale()</a></span>），但是逐字节操作。
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     最后一些函数会假定字符串是使用某特定编码的，通常是
     UTF-8。<a href="book.intl.php" class="link">intl</a> 扩展和
     <a href="book.pcre.php" class="link">PCRE</a>（上例中仅在使用了
     <code class="literal">u</code> 修饰符时）扩展中的大部分函数都是这样。
    </span>
   </li>
  </ul>

  <p class="para">
   最后，要书写能够正确使用 Unicode 的程序依赖于很小心地避免那些可能会损坏数据的函数。要使用来自于
   <a href="book.intl.php" class="link">intl</a> 和 <a href="book.mbstring.php" class="link">mbstring</a>
   扩展的函数。不过使用能处理 Unicode 编码的函数只是个开始。不管用何种语言提供的函数，最基本的还是了解
   Unicode 规格。例如一个程序如果假定只有大写和小写，那可是大错特错。
  </p>
 </div>

</div><?php manual_footer($setup); ?>