<?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 => 'ru',
  ),
  'this' => 
  array (
    0 => 'language.types.string.php',
    1 => 'Строки',
    2 => 'Строки',
  ),
  'up' => 
  array (
    0 => 'language.types.php',
    1 => 'Типы',
  ),
  'prev' => 
  array (
    0 => 'language.types.float.php',
    1 => 'Числа с плавающей точкой',
  ),
  'next' => 
  array (
    0 => 'language.types.numeric-strings.php',
    1 => 'Числовые строки',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    '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">Строки</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>) ограничивается 2 ГБ — максимум 2 147 483 647 байтов.
  </span>
 </p></blockquote>

 <div class="sect2" id="language.types.string.syntax">
  <h3 class="title">Синтаксис</h3>

  <p class="para">
   Строковый литерал определяют четырьмя способами:
  </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>. В остальных случаях обратный слеш в одинарных кавычках
    обрабатывается как буквальный обратный слеш: PHP не интерпретирует последовательности
    вроде <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.variables.php" class="link">Переменные</a> и управляющие последовательности
     служебных символов в одинарных кавычках <em>не</em> обрабатываются,
     в отличие от синтаксиса <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>.
    </span>
   </p></blockquote>

   <div class="example" id="example-1">
    <p><strong>Пример #1 Виды синтаксиса</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: #007700">echo </span><span style="color: #DD0000">'Это — простая строка'</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">'Переводы строки внутри кавычек<br />становятся частью строкового значения<br />и корректно обрабатываются'</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// Выводит: Однажды Арнольд сказал: "I'll be back"<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'Однажды Арнольд сказал: "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">// Выводит: Вы удалили C:\*.*?<br />// (Обратите внимание на экранирование обратным слешем спецсимвола \ — прим. перев.)<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'Вы удалили 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">// Выводит: Вы удалили C:\*.*?<br />// (Символ * не относится к спецсимволам и не образует в паре с обратным слешем управляющую последовательность,<br />// поэтому обратный слеш не экранирует символ * и выводится как есть — прим. перев.)<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'Вы удалили 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">// Выводит: В одинарных кавычках управляющая последовательность \n не разворачивается в символ перевода строки<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'В одинарных кавычках управляющая последовательность \n не разворачивается в символ перевода строки'</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// Выводит: Переменные $expand и $either также не разворачиваются<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'Переменные $expand и $either также не разворачиваются'</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;</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 этот управляющий символ обозначается аббревиатурой HT и соответствует коду 0x1B в шестнадцатеричной или 27 в десятичной нотации</td>
      </tr>

      <tr>
       <td><code class="literal">\f</code></td>
       <td>Подача страницы. В кодировке ASCII этот управляющий символ обозначается аббревиатурой HT и соответствует коду 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>
        Символы Юникода: последовательность символов, которая соответствует
        регулярному выражению <code class="literal">[0-9A-Fa-f]+</code>, — кодовая точка Юникода,
        которая выводится как строка в кодировке 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>. Следом за этим оператором указывают идентификатор,
    а затем перевод строки. Затем идёт сама строка, за которой снова идёт тот же идентификатор,
    чтобы закрыть вставку.
   </p>

   <p class="simpara">
    Закрывающий идентификатор разрешается отбивать пробелами или символами табуляции,
    и тогда отступ удалится из каждой строки в блоке документа. До PHP 7.3.0
    закрывающий идентификатор указывали <em>в самом начале</em> новой строки.
   </p>

   <p class="simpara">
    Кроме того, закрывающий идентификатор подчиняется тем же правилам именования,
    что и другие метки в PHP: содержит только буквенно-цифровые символы
    и подчёркивания, и не начинается с цифрового символа или символа подчёркивания.
   </p>

   <div class="example" id="example-2">
    <p><strong>Пример #2 Базовый пример heredoc-синтаксиса в 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 /><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 /><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">
    PHP выбросит исключение <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 /><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">
    В теле и перед идентификатором окончания heredoc-блока разрешается делать отступы
    символами пробелов и табуляции, но <em>нельзя</em> смешивать символы
    табуляции и пробелы относительно отступа идентификатора закрытия и отступа тела
    до начала закрывающего идентификатора; heredoc-синтаксис будет работать с отступом перед маркером закрытия,
    только если каждая строка тела начинается, но не ограничивается, с того же отступа,
    что и отступ перед маркером закрытия. При несовпадении отступов в начале строк тела с отступом
    перед идентификатором закрытия PHP выбросит исключение <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 /><br /></span><span style="color: #FF8000">/**<br /> * Каждый следующий пример кода не работает<br /> */<br /><br />// Отступ тела отличается от отступа маркера окончания:<br />// тело — 5 пробелов, маркер окончания — 2 символа табуляции<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 /><br /></span><span style="color: #FF8000">// Смешивание пробелов и табуляций в теле:<br />// тело — 4 пробела + 1 символ табуляции, маркер окончания — 5 пробелов<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 /><br /></span><span style="color: #FF8000">// Смешивание пробелов и табуляций в маркере окончания:<br />// тело — 10 пробелов, маркер окончания — 2 символа табуляции + 1 пробел<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 /><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 /><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 /><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 /></span><span style="color: #FF8000">// Отступ перед закрывающим идентификатором недопустим<br /></span><span style="color: #007700">}</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 /><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">$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 />}</span></span></code></div>
     </div>

    </div>
    <p class="para">
     В Heredoc-синтаксисе, который содержит переменные, нельзя инициализировать свойства класса.
    </p>

   </div>

   <p class="para">
    Heredoc-текст ведёт себя как строка в двойных кавычках, хотя и не заключается в двойные кавычки.
    То есть в heredoc кавычки не экранируют,
    но перечисленные управляющие коды по-прежнему разрешено указывать.
    Переменные разворачиваются, но в выражениях со сложными переменными внутри heredoc
    работают так же внимательно, как и при работе со строками.
   </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 /><br />$str </span><span style="color: #007700">= &lt;&lt;&lt;EOD<br /></span><span style="color: #DD0000">Пример строки,<br />которую записали heredoc-синтаксисом<br />в несколько строк.<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">'Расмус'</span><span style="color: #007700">;<br /><br />echo &lt;&lt;&lt;EOT<br /></span><span style="color: #DD0000">Меня зовут "</span><span style="color: #0000BB">$name</span><span style="color: #DD0000">". Я печатаю </span><span style="color: #0000BB">$foo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo</span><span style="color: #DD0000">.<br />Теперь я вывожу </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 />Это выведет заглавную букву 'A': \x41<br /></span><span style="color: #007700">EOT;</span></span></code></div>
    </div>

    
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Меня зовут &quot;Расмус&quot;. Я печатаю Foo.
Теперь, я вывожу Bar2.
Это выведет заглавную букву &#039;A&#039;: A</pre></div>
    </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 /><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 />));</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 /><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">Здесь ничего нет...<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">Пример использования константы<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">Пример использования поля<br /></span><span style="color: #007700">FOOBAR;<br />}</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 /><br /></span><span style="color: #007700">echo &lt;&lt;&lt;"FOOBAR"<br /></span><span style="color: #DD0000">Привет, мир!<br /></span><span style="color: #007700">FOOBAR;</span></span></code></div>
    </div>

   </div>

  </div>

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

   <p class="para">
    Nowdoc — то же для строк в одинарных кавычках, что и heredoc для строк
    в двойных кавычках. Синтаксис Nowdoc похож на heredoc-синтаксис, но внутри него
    <em>не выполняются интерполяция строк</em>. Конструкция
    легко встраивает PHP-код или другие большие блоки текста без
    предварительного экранирования. В этом он отчасти похож на SGML-конструкцию
    <code class="literal">&lt;![CDATA[ ]]&gt;</code>, в том, что он объявляет блок текста,
    который не требует обработки.
   </p>

   <p class="para">
    Nowdoc задают той же последовательностью символов <code class="literal">&lt;&lt;&lt;</code>,
    что и в heredoc, но следующий за ней идентификатор берут
    в одинарные кавычки, например, <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 /><br /></span><span style="color: #007700">echo &lt;&lt;&lt;'EOD'<br /></span><span style="color: #DD0000">Пример текста,<br />занимающего несколько строк,<br />написанного синтаксисом nowdoc. Обратные слеши выводятся без обработки,<br />например, \\ и \'.<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>
Пример текста,
занимающего несколько строк,
написанного синтаксисом nowdoc. Обратные слеши выводятся без обработки,
например, \\ и \&#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">'Расмус'</span><span style="color: #007700">;<br /><br />echo &lt;&lt;&lt;'EOT'<br /></span><span style="color: #DD0000">Меня зовут "$name". Я печатаю $foo-&gt;foo.<br />Теперь я печатаю {$foo-&gt;bar[1]}.<br />Это не выведет заглавную 'A': \x41<br /></span><span style="color: #007700">EOT;</span></span></code></div>
    </div>

    
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Меня зовут &quot;$name&quot;. Я печатаю $foo-&gt;foo.
Теперь я печатаю {$foo-&gt;bar[1]}.
Это не выведет заглавную &#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 /><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">$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 />}</span></span></code></div>
    </div>

   </div>

  </div>

  <div class="sect3" id="language.types.string.parsing">
   <h4 class="title">Интерполяция строк</h4>

   <p class="simpara">
    PHP умеет подставлять внутри строк значения вместо <a href="language.variables.php" class="link">переменных</a>,
    если строку (<span class="type"><a href="language.types.string.php" class="type string">string</a></span>) указали в двойных кавычках или heredoc-синтаксисом.
   </p>

   <p class="simpara">
    В PHP предусмотрели два вида синтаксиса для указания переменных в строках:
    <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.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">
     PHP интерпретирует как переменную и подставит вместо переменной значение этой переменной,
     если встретит в строке знак доллара <code class="literal">$</code>,
     за которым идут символы, допустимые для составления названий переменных.
    </p>

    <div class="example" id="example-16">
     <p><strong>Пример #16 Интерполяция строк</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$juice </span><span style="color: #007700">= </span><span style="color: #DD0000">"яблочного"</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"Он выпил немного </span><span style="color: #0000BB">$juice</span><span style="color: #DD0000"> сока." </span><span style="color: #007700">. </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;</span></span></code></div>
     </div>

     
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Он выпил немного яблочного сока.
</pre></div>
     </div>
    </div>

    <p class="simpara">
     Формально структура базового синтаксиса подстановки переменных
     выглядит вот так:
    </p>
    <div class="informalexample">
     <div class="example-contents">
<div class="annotation-interactive cdata"><pre>
строковая переменная::
     имя-переменной (смещение-или-свойство)?
   | ${ выражение }

смещение-или-свойство::
     смещение в строке
   | свойство-в-строке

смещение-в-строке::
     [ имя ]
   | [ имя-переменной ]
   | [ целочисленный-литерал ]

свойство-в-строке::
     -&gt; имя

имя-переменной::
     $ имя

имя::
     [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">${ выражение }</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 /><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">);</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 /><br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"Строка не содержит переменных $ для интерполяции\n"</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"Строка не содержит переменных $\n для интерполяции\n"</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"Строка не содержит переменных $2 для интерполяции\n"</span><span style="color: #007700">;</span></span></code></div>
      </div>

      
<p class="para">
 Результат выполнения приведённого примера:
</p>

      <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Строка не содержит переменных $ для интерполяции
Строка не содержит переменных $
для интерполяции
Строка не содержит переменных $2 для интерполяции
</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">"яблочного"</span><span style="color: #007700">, </span><span style="color: #DD0000">"апельсинового"</span><span style="color: #007700">, </span><span style="color: #DD0000">"string_key" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"фиолетового"</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #DD0000">"Он выпил немного </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"> сока."</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">"Он выпил немного </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"> сока."</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">"Он выпил немного </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"> сока."</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<br /></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">"Значение свойства объекта: </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">;</span></span></code></div>
     </div>

     
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Он выпил немного яблочного сока.
Он выпил немного апельсинового сока.
Он выпил немного фиолетового сока.
Значение свойства объекта: 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 /><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">"Символ с индексом -2 равен </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">"Изменение символа на позиции -3 на 'o' даёт следующую строку: </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">;</span></span></code></div>
     </div>

     
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Символ с индексом -2 равен n.
Изменение символа на позиции -3 на «o» даёт следующую строку: 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">
     В строках продвинутым синтаксисом указывают скалярные переменные, элементы массива,
     статические и динамические свойства объекта со строковым представлением.
     Выражение записывается как и вне строки, а затем оборачивается
     в фигурные скобки <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 Синтаксис фигурных скобок</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: #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">'здорово'</span><span style="color: #007700">;<br /><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">'Индексное значение'</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'const-key' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'Ключ со знаком минуса'</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">// Не работает, выводит: Это { здорово}<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"Это { </span><span style="color: #0000BB">$great</span><span style="color: #DD0000">}" </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">"Это </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">. </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">"Это {</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">. </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br />class </span><span style="color: #0000BB">Square<br /></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">)<br />    {<br />        </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 /><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">"Ширина квадрата составляет </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 сантиметров." </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">"Это работает: </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">. </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">"Это работает: </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">. </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"Работает: </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">. </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">"Это работает: </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">. </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"Работает: </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">. </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"Работает: </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">. </span><span style="color: #0000BB">PHP_EOL</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">. </span><span style="color: #0000BB">PHP_EOL</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">. </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;</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">
    Символы внутри строк индексируются с начала строки, индексы начинаются с 0.
    Смещение символа, который требуется прочитать или изменить внутри строки,
    указывают после строки в квадратных скобках массива (<span class="type"><a href="language.types.array.php" class="type array">array</a></span>),
    например <var class="varname">$str[42]</var>.
    Для этого о строке думают как о массиве символов.
    Больше одного символа получают и заменяют
    функциями <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 поддерживаются отрицательные значения смещения.
     Они задают смещение с конца строки. Раньше отрицательные смещение вызывали
     ошибку уровня <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong> при чтении (возвращая пустую строку)
     или <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 присваивание пустой строки вызовет фатальную ошибку. Раньше
     присваивался нулевой байт (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 /><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">);</span></span></code></div>
    </div>

   </div>

   <p class="para">
    Смещение в строке задают либо целым числом, либо целочисленной строкой,
    иначе PHP выдаст предупреждение.
   </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 /><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 />}</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">
     Доступ к символам в строковых литералах
     через оператор <code class="literal">{}</code> объявили устаревшим в PHP 7.4
     и удалили в PHP 8.0.
    </p>
   </p></blockquote>
  </div>
 </div>

 <div class="sect2" id="language.types.string.useful-funcs">
  <h3 class="title">Полезные функции и операторы</h3>

  <p class="para">
   Строки объединяют оператором «.» — точки.
   Обратите внимание, оператор сложения «+» здесь <em>не работает</em>.
   Подробнее об этом рассказывает раздел
   «<a href="language.operators.string.php" class="link">Строковые операторы</a>».
  </p>

  <p class="para">
   В языке предусмотрели ряд полезных функций для манипулирования строками.
  </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">
   В PHP также предусмотрели <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="function"><a href="function.echo.php" class="function">echo</a></span>
   или <span class="function"><a href="function.print.php" class="function">print</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> преобразовывается в строку
   <code class="literal">&quot;1&quot;</code>, а логическое значение <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> преобразовывается
   в <code class="literal">&quot;&quot;</code> (пустую строку). Такое поведение допускает преобразование значения
   в обе стороны — из логического типа в строковый и наоборот.
  </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>) преобразовывается в строку, которая представит число в текстовом виде,
   включая экспоненциальную часть для чисел с плавающей точкой.
   Большие числа с плавающей точкой преобразовываются в экспоненциальную запись: <code class="literal">4.1E+6</code>.
  </p>

  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    Начиная с PHP 8.0.0 разделитель дробной части
    обозначается только точкой: &quot;<code class="literal">.</code>&quot;.
    До PHP 8.0.0 символ десятичной точки определялся функцией <span class="function"><a href="function.setlocale.php" class="function">setlocale()</a></span>
    при установке региональных настроек скрипта для категории LC_NUMERIC.
   </p>
  </p></blockquote>

  <p class="para">
   Массивы преобразовываются в строку <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"><a href="language.types.array.php" class="type array">array</a></span>).
   Отдельные элементы массива выводятся конструкцией <code class="literal">echo $arr[&#039;foo&#039;]</code>.
   Следующие параграфы расскажут о просмотре содержимого массивов.
  </p>

  <p class="para">
   Для преобразования объекта (<code class="literal">object</code>) в строку (<span class="type"><a href="language.types.string.php" class="type string">string</a></span>)
   определяют магический метод
   <a href="language.oop5.magic.php" class="link">__toString</a>.
  </p>

  <p class="para">
   Ресурс (<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>) наподобие
   <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> во время исполнения кода.
   Идентификатор отдельного ресурса уникален только в рамках текущего выполнения скрипта —
   веб-запроса или CLI-процесса, — но не гарантирует одинаковых значений при очередном запуске,
   поэтому нельзя полагаться на точное повторение значения идентификатора.
   Тип ресурса возвращает функция <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="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="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">
   Строковый тип (<span class="type"><a href="language.types.string.php" class="type string">string</a></span>) в PHP реализовали в виде массива
   байтов и целочисленного значения, которое содержит длину буфера. В этой структуре
   нет информации о том, как преобразовывать байты в символы,
   эту задачу решает программист. Нет ограничений на значения, из которых состоит строка,
   например, байт со значением <code class="literal">0</code> (NUL-байт) разрешается
   где угодно в строке (однако рекомендуют учитывать, что ряд функций,
   которые в этом руководстве назвали «бинарно небезопасными»,
   передают строки библиотекам, которые игнорируют данные после 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, последовательности <code class="literal">&quot;\x61\xCC\x81&quot;</code>
   в кодировке UTF-8 с формой нормализации D или другому возможному
   представлению? Ответ такой: строка закодируется
   способом, которым её закодировали в файле скрипта. Поэтому, если
   скрипт записан в кодировке 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>,
   которые корректно обрабатывают строки с многобайтовыми символами.
   Работа с правильными PHP-функциями обработки строк в Юникоде —
   только начало, дополнительно потребуется изучить спецификацию стандарта Unicode.
   Строки состоят не только из прописных и строчных букв и часто не только из символов латинского алфавита,
   поэтому лучше готовить программу к обработке строк из многобайтовых символов.
  </p>
 </div>
</div><?php manual_footer($setup); ?>