Строка представляет собой последовательность символов, где символ совпадает с байтом. Это означает, что PHP поддерживает только набор из 256 символов и, следовательно, не предлагает встроенной поддержки Unicode. 

Примечание . В 32-разрядных сборках длина строки может достигать 2 ГБ (максимум 2 147 483 647 байт) .

Строковый литерал может быть указан четырьмя различными способами:

  • одиночные кавычки
  • двойные кавычки
  • синтаксис heredoc
  • синтаксис nowdoc

Одиночные кавычки

Самый простой способ указать строку — заключить ее в одинарные кавычки (символ ').

Чтобы указать буквальную одинарную кавычку, используйте обратную косую черту ( \). Чтобы указать буквальную обратную косую черту, удвойте ее ( \\). Все другие экземпляры обратной косой черты будут рассматриваться как буквальная обратная косая черта: это означает, что другие escape-последовательности, к которым вы могли привыкнуть, такие как \rили \n, будут выводиться буквально, как указано, а не иметь какого-либо специального значения.

Примечание . В отличие от синтаксиса с двойными кавычками и синтаксиса heredoc , переменные и escape-последовательности для специальных символов не будут раскрываться, если они встречаются в строках с одинарными кавычками .

<?php
echo 'this is a simple string';

echo 'You can also have embedded newlines in
strings this way as it is
okay to do';

// Outputs: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';

// Outputs: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';

// Outputs: You deleted C:\*.*?
echo 'You deleted C:\*.*?';

// Outputs: This will not expand: \n a newline
echo 'This will not expand: \n a newline';

// Outputs: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>

Двойные кавычки

Если строка заключена в двойные кавычки ("), PHP интерпретирует следующие управляющие последовательности для специальных символов:

ПоследовательностьЗначение
\nперевод строки (LF или 0x0A (10) в ASCII)
\rвозврат каретки (CR или 0x0D (13) в ASCII)
\tгоризонтальная вкладка (HT или 0x09 (9) в ASCII)
\vвертикальная табуляция (VT или 0x0B (11) в ASCII)
\eescape (ESC или 0x1B (27) в ASCII)
\fподача формы (FF или 0x0C (12) в ASCII)
\\обратная косая черта
\$знак доллара
\"двойная кавычка
\[0-7]{1,3}последовательность символов, соответствующая регулярному выражению, представляет собой символ в восьмеричной системе счисления, который незаметно переполняется, чтобы соответствовать байту (например, "\400" === "\000")
\x[0-9A-Fa-f]{1,2}последовательность символов, соответствующая регулярному выражению, является символом в шестнадцатеричной системе счисления
\u{[0-9A-Fa-f]+}последовательность символов, соответствующая регулярному выражению, представляет собой кодовую точку Unicode, которая будет выводиться в строку как представление этой кодовой точки в кодировке UTF-8.

Как и в строке с одинарными кавычками , экранирование любого другого символа также приведет к печати обратной косой черты.

Наиболее важной особенностью строки в двойных кавычках является то, что имена переменных будут расширены. Подробности смотрите в разборе строк .

Вот документ

Третий способ разграничить строку s — это синтаксис heredoc: <<<. После этого оператора указывается идентификатор, затем перевод строки. Далее следует сама строка , а затем снова тот же идентификатор, чтобы закрыть цитату.

Закрывающий идентификатор может иметь отступ в виде пробела или табуляции, и в этом случае отступ будет удален из всех строк в строке документа. До PHP 7.3.0 закрывающий идентификатор должен начинаться в первом столбце строки.

Кроме того, закрывающий идентификатор должен соответствовать тем же правилам именования, что и любая другая метка в PHP: он должен содержать только буквенно-цифровые символы и символы подчеркивания и должен начинаться с нецифрового символа или символа подчеркивания.

Пример #1 Базовый пример Heredoc для PHP 7.3.0

<?php
// no indentation
echo <<<END
      a
     b
    c
\n
END;

// 4 spaces of indentation
echo <<<END
      a
     b
    c
    END;

Вывод приведенного выше примера в PHP 7.3:

      а
     б
    с

  а
 б
с

Если отступ закрывающего идентификатора больше, чем любые строки тела, будет выброшена ошибка ParseError :

Пример #2 Закрывающий идентификатор не должен иметь отступ дальше любой строки тела

<?php
echo <<<END
  a
 b
c
   END;

Вывод приведенного выше примера в PHP 7.3:

Ошибка синтаксического анализа PHP: недопустимый уровень отступа тела (ожидается уровень отступа не менее 3) в example.php в строке 4

Если закрывающий идентификатор имеет отступ, можно также использовать табуляцию, однако табуляции и пробелы не должны смешиваться в отношении отступа закрывающего идентификатора и отступа тела (вплоть до закрывающего идентификатора). В любом из этих случаев будет выдан ParseError . Эти ограничения пробелов были включены, потому что смешивание табуляций и пробелов для отступов вредно для удобочитаемости.

Пример #3 Разный отступ для закрывающего идентификатора тела (пробелов)

<?php
// All the following code do not work.

// different indentation for body (spaces) ending marker (tabs)
{
    echo <<<END
     a
        END;
}

// mixing spaces and tabs in body
{
    echo <<<END
        a
     END;
}

// mixing spaces and tabs in ending marker
{
    echo <<<END
          a
         END;
}

Вывод приведенного выше примера в PHP 7.3:

Ошибка синтаксического анализа PHP: недопустимый отступ — вкладки и пробелы нельзя смешивать в строке 8 example.php

За закрывающим идентификатором основной строки не обязательно следовать точкой с запятой или новой строкой. Например, начиная с PHP 7.3.0 разрешен следующий код:

Пример #4 Продолжение выражения после закрывающего идентификатора

<?php
$values = [<<<END
a
  b
    c
END, 'd e f'];
var_dump($values);

Вывод приведенного выше примера в PHP 7.3:

массив (2) {
  [0] =>
  строка (11) "а
  б
    с"
  [1] =>
  строка(5) "de f"
}

Предупреждение

Если закрывающий идентификатор был найден в начале строки, то вне зависимости от того, был ли он частью другого слова, он может рассматриваться как закрывающий идентификатор и вызывает ParseError .

Пример #5 Закрывающий идентификатор в теле строки может вызвать ParseError

<?php
$values = [<<<END
a
b
END ING
END, 'd e f'];

Вывод приведенного выше примера в PHP 7.3:

Ошибка синтаксического анализа PHP: синтаксическая ошибка, неожиданный идентификатор «ING», ожидание «]» в example.php в строке 6

Чтобы избежать этой проблемы, вам безопасно следовать простому правилу: не выбирайте закрывающий идентификатор, который появляется в теле текста .

Предупреждение

До PHP 7.3.0 очень важно отметить, что строка с закрывающим идентификатором не должна содержать никаких других символов, кроме точки с запятой ( ;). Это означает, в частности, что идентификатор не может иметь отступ , и не может быть никаких пробелов или табуляции до или после точки с запятой. Также важно понимать, что первый символ перед закрывающим идентификатором должен быть символом новой строки, как это определено в локальной операционной системе. Это \nв системах UNIX, включая macOS. За закрывающим разделителем также должен следовать перевод строки.

Если это правило нарушено и закрывающий идентификатор не является «чистым», он не будет считаться закрывающим идентификатором, и PHP продолжит его поиск. Если правильный закрывающий идентификатор не будет найден до конца текущего файла, в последней строке возникнет ошибка синтаксического анализа.

Пример #6 Неверный пример, до версии PHP 7.3.0

<?php
class foo {
    public $bar = <<<EOT
bar
    EOT;
}
// Identifier must not be indented
?>

Пример #7 Допустимый пример, даже если версия PHP до 7.3.0

<?php
class foo {
    public $bar = <<<EOT
bar
EOT;
}
?>

Heredocs, содержащие переменные, не могут использоваться для инициализации свойств класса.

Текст Heredoc ведет себя так же, как строка в двойных кавычках, без двойных кавычек. Это означает, что кавычки в heredoc не нужно экранировать, но все же можно использовать коды escape, перечисленные выше. Переменные раскрываются, но при выражении сложных переменных внутри heredoc необходимо соблюдать такую ​​же осторожность, как и при использовании строки s.

Example #8 Пример цитирования строки Heredoc

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

/* More complex example, with variables. */
class foo
{
    var $foo;
    var $bar;

    function __construct()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'MyName';

echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>

Приведенный выше пример выведет:

Меня зовут "МоеИмя". Я печатаю немного Foo.
Сейчас я печатаю Bar2.
Это должно напечатать заглавную букву «А»: А

Также можно использовать синтаксис Heredoc для передачи данных в аргументы функции:

Пример #9 Пример здесьdoc в аргументах

<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>

Можно инициализировать статические переменные и свойства/константы класса, используя синтаксис Heredoc:

Пример #10 Использование Heredoc для инициализации статических значений

<?php
// Static variables
function foo()
{
    static $bar = <<<LABEL
Nothing in here...
LABEL;
}

// Class properties/constants
class foo
{
    const BAR = <<<FOOBAR
Constant example
FOOBAR;

    public $baz = <<<FOOBAR
Property example
FOOBAR;
}
?>

Открывающий идентификатор Heredoc может быть заключен в двойные кавычки:

Пример #11 Использование двойных кавычек в Heredoc

<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?>

Nowdoc

Nowdocs относится к строкам в одинарных кавычках так же, как heredocs к строкам в двойных кавычках. Nowdoc определяется так же, как heredoc, но внутри nowdoc не выполняется синтаксический анализ . Эта конструкция идеально подходит для встраивания кода PHP или других больших блоков текста без необходимости экранирования. У него есть некоторые общие черты с <![CDATA[ ]]>конструкцией SGML, в том, что он объявляет блок текста, который не предназначен для синтаксического анализа.

Nowdoc идентифицируется той же <<< последовательностью, которая используется для heredoc, но идентификатор, который следует за ним, заключен в одинарные кавычки, например <<<'EOT'. Все правила для идентификаторов heredoc также применяются к идентификаторам nowdoc, особенно те, которые касаются внешнего вида закрывающего идентификатора.

Example #12 Пример цитирования строки Nowdoc

<?php
echo <<<'EOD'
Example of string spanning multiple lines
using nowdoc syntax. Backslashes are always treated literally,
e.g. \\ and \'.
EOD;

Приведенный выше пример выведет:

Пример строки, занимающей несколько строк используя синтаксис nowdoc. Обратная косая черта всегда трактуется буквально, например \\ и \'.

Example #13 Пример цитирования строки Nowdoc с переменными

<?php
class foo
{
    public $foo;
    public $bar;

    function __construct()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'MyName';

echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
EOT;
?>

Приведенный выше пример выведет:

Меня зовут "$имя". Я печатаю некоторые $foo->foo. Теперь я печатаю {$foo->bar[1]}. Это не должно печатать заглавную букву «А»: \x41

Пример #14 Пример статических данных

<?php
class foo {
    public $bar = <<<'EOT'
bar
EOT;
}
?>

Разбор переменных

Когда строка указана в двойных кавычках или с помощью heredoc, в ней анализируются переменные .

Существует два типа синтаксиса: простой и сложный . Простой синтаксис является наиболее распространенным и удобным. Он позволяет встроить переменную, значение массива или свойство объекта в строку с минимальными усилиями.

Сложный синтаксис можно узнать по фигурным скобкам, окружающим выражение.

Простой синтаксис

Если встречается знак доллара ( $), синтаксический анализатор жадно возьмет столько токенов, сколько возможно, чтобы сформировать допустимое имя переменной. Заключите имя переменной в фигурные скобки, чтобы явно указать конец имени.

<?php
$juice = "apple";

echo "He drank some $juice juice.".PHP_EOL;
// Invalid. "s" is a valid character for a variable name, but the variable is $juice.
echo "He drank some juice made of $juices.";
// Valid. Explicitly specify the end of the variable name by enclosing it in braces:
echo "He drank some juice made of ${juice}s.";
?>

Приведенный выше пример выведет:

Он выпил немного яблочного сока. Он выпил немного сока, приготовленного из . Он выпил немного сока из яблок.

Точно так же можно анализировать индекс массива или свойство объекта . В индексах массива закрывающая квадратная скобка ( ]) отмечает конец индекса. К свойствам объектов применяются те же правила, что и к простым переменным.

Пример #15 Пример простого синтаксиса

<?php
$juices = array("apple", "orange", "koolaid1" => "purple");

echo "He drank some $juices[0] juice.".PHP_EOL;
echo "He drank some $juices[1] juice.".PHP_EOL;
echo "He drank some $juices[koolaid1] juice.".PHP_EOL;

class people {
    public $john = "John Smith";
    public $jane = "Jane Smith";
    public $robert = "Robert Paulsen";

    public $smith = "Smith";
}

$people = new people();

echo "$people->john drank some $juices[0] juice.".PHP_EOL;
echo "$people->john then said hello to $people->jane.".PHP_EOL;
echo "$people->john's wife greeted $people->robert.".PHP_EOL;
echo "$people->robert greeted the two $people->smiths."; // Won't work
?>

Приведенный выше пример выведет:

Он выпил немного яблочного сока.
Он выпил немного апельсинового сока.
Он выпил фиолетового сока.
Джон Смит выпил немного яблочного сока.
Затем Джон Смит поздоровался с Джейн Смит.
Жена Джона Смита приветствовала Роберта Полсена.
Роберт Полсен поприветствовал их.

Начиная с PHP 7.1.0 также поддерживаются отрицательные числовые индексы.

Пример #16 Отрицательные числовые индексы

<?php
$string = 'string';
echo "The character at index -2 is $string[-2].", PHP_EOL;
$string[-3] = 'o';
echo "Changing the character at index -3 to o gives $string.", PHP_EOL;
?>

Приведенный выше пример выведет:

Символ с индексом -2 равен n.
Изменение символа с индексом -3 на o дает сильный.

Для чего-то более сложного следует использовать сложный синтаксис.

Сложный (кудрявый) синтаксис

Это называется сложным не потому, что сложный синтаксис, а потому, что он позволяет использовать сложные выражения.

С помощью этого синтаксиса можно включить любую скалярную переменную, элемент массива или свойство объекта со строковым представлением. Выражение записывается так же, как оно выглядело бы вне строки , а затем оборачивается в {и }. Так {как экранирование невозможно, этот синтаксис будет распознан только в том случае, если $сразу следует за {. Используйте {\$, чтобы получить литерал {$. Несколько примеров, чтобы было понятно:

<?php
// Show all errors
error_reporting(E_ALL);

$great = 'fantastic';

// Won't work, outputs: This is { fantastic}
echo "This is { $great}";

// Works, outputs: This is fantastic
echo "This is {$great}";

// Works
echo "This square is {$square->width}00 centimeters broad.";


// Works, quoted keys only work using the curly brace syntax
echo "This works: {$arr['key']}";


// Works
echo "This works: {$arr[4][3]}";

// This is wrong for the same reason as $foo[bar] is wrong  outside a string.
// In other words, it will still work, but only because PHP first looks for a
// constant named foo; an error of level E_NOTICE (undefined constant) will be
// thrown.
echo "This is wrong: {$arr[foo][3]}";

// Works. When using multi-dimensional arrays, always use braces around arrays
// when inside of strings
echo "This works: {$arr['foo'][3]}";

// Works.
echo "This works: " . $arr['foo'][3];

echo "This works too: {$obj->values[3]->name}";

echo "This is the value of the var named $name: {${$name}}";

echo "This is the value of the var named by the return value of getName(): {${getName()}}";

echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}";

// Won't work, outputs: This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";

// Won't work, outputs: C:\folder\{fantastic}.txt
echo "C:\folder\{$great}.txt"
// Works, outputs: C:\folder\fantastic.txt
echo "C:\\folder\\{$great}.txt"
?>

Также можно получить доступ к свойствам класса, используя переменные в строках, используя этот синтаксис.

<?php
class foo {
    var $bar = 'I am bar.';
}

$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->{$baz[1]}}\n";
?>

Примечание :

Значение, полученное из функций, вызовов методов, переменных статического класса и констант класса внутри {$}, будет интерпретироваться как имя переменной в области, в которой определена строка. Использование одинарных фигурных скобок ( {}) не будет работать для доступа к возвращаемым значениям функций или методов или значениям констант класса или статических переменных класса.

<?php
// Show all errors.
error_reporting(E_ALL);

class beers {
    const softdrink = 'rootbeer';
    public static $ale = 'ipa';
}

$rootbeer = 'A & W';
$ipa = 'Alexander Keith\'s';

// This works; outputs: I'd like an A & W
echo "I'd like an {${beers::softdrink}}\n";

// This works too; outputs: I'd like an Alexander Keith's
echo "I'd like an {${beers::$ale}}\n";
?>

Доступ к строке и модификация по символу

Доступ к символам в строке s и их изменение можно получить, указав отсчитываемое от нуля смещение нужного символа после строки с помощью квадратных скобок массива , как в $str[42] . Думайте о строке как о массиве символов для этой цели. Функции substr() и substr_replace() можно использовать, когда вы хотите извлечь или заменить более 1 символа.

Примечание . Начиная с PHP 7.1.0 также поддерживаются отрицательные смещения строк. Они определяют смещение от конца строки. Раньше отрицательные смещения генерировались E_NOTICEдля чтения (получая пустую строку) и E_WARNINGдля записи (оставляя строку нетронутой).

Примечание . До версии PHP 8.0.0 к строке s также можно было получить доступ с помощью фигурных скобок, как в $str{42} , для той же цели. Этот синтаксис фигурных скобок устарел в PHP 7.4.0 и больше не поддерживается в PHP 8.0.0.

Предупреждение

При записи вне допустимого смещения строка дополняется пробелами. Нецелые типы преобразуются в целые. Недопустимый тип смещения выдает E_WARNING. Используется только первый символ назначенной строки. Начиная с PHP 7.1.0, присваивание пустой строки приводит к фатальной ошибке. Раньше ему присваивался байт NULL.

Предупреждение

Внутри строки PHP представляют собой байтовые массивы. В результате доступ к строке или ее изменение с помощью скобок массива небезопасно для многобайтовых данных и должно выполняться только со строками в однобайтовой кодировке, такой как ISO-8859-1.

Примечание . Начиная с PHP 7.1.0, применение оператора пустого индекса к пустой строке приводит к фатальной ошибке. Раньше пустая строка автоматически преобразовывалась в массив.

Example #17 Некоторые примеры строк

<?php
// Get the first character of a string
$str = 'This is a test.';
$first = $str[0];

// Get the third character of a string
$third = $str[2];

// Get the last character of a string.
$str = 'This is still a test.';
$last = $str[strlen($str)-1];

// Modify the last character of a string
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';

?>

Смещения строк должны быть либо целыми числами, либо целыми строками, иначе будет выдано предупреждение.

Example #18 Пример недопустимых смещений строк

<?php
$str = 'abc';

var_dump($str['1']);
var_dump(isset($str['1']));

var_dump($str['1.0']);
var_dump(isset($str['1.0']));

var_dump($str['x']);
var_dump(isset($str['x']));

var_dump($str['1x']);
var_dump(isset($str['1x']));
?>

Приведенный выше пример выведет:

строка(1) "б"
логический (правда)

Предупреждение: недопустимое смещение строки '1.0' в /tmp/t.php в строке 7.
строка(1) "б"
логический (ложный)

Предупреждение: недопустимое смещение строки 'x' в /tmp/t.php в строке 9.
строка(1) "а"
логический (ложный)
строка(1) "б"
логический (ложный)

Примечание :

Доступ к переменным других типов (не включая массивы или объекты, реализующие соответствующие интерфейсы) с помощью []или {}автоматически возвращает null.

Примечание :

Доступ к символам в строковых литералах можно получить с помощью []или {}.

Примечание :

Доступ к символам в строковых литералах с использованием {}синтаксиса устарел в PHP 7.4. Это было удалено в PHP 8.0.

Полезные функции и операторы

Строка s может быть объединена с помощью '.' (точка) оператор. Обратите внимание, что оператор «+» (сложение) для этого не работает. Дополнительные сведения см. в разделе Строковые операторы .

Существует ряд полезных функций для работы со строками .

Общие функции см. в разделе строковых функций, а расширенные функции поиска и замены — в Perl совместимых функциях регулярных выражений .

Существуют также функции для строк URL и функции для шифрования/дешифрования строк ( Sodium и Hash ).

Наконец, см. также функции символьного типа .

Преобразование в строку

Значение может быть преобразовано в строку с помощью (string)приведения или функции strval() . Преобразование строк выполняется автоматически в области выражения, где требуется строка . Это происходит при использовании функций echo или print или при сравнении переменной со строкой . Разделы о типах и жонглировании типами прояснят следующее. См. также функцию settype() .

Логическое значение true преобразуется в строку "1" . bool false преобразуется в ""(пустую строку). Это позволяет выполнять преобразование между логическими и строковыми значениями.

Целое число или число с плавающей запятой преобразуются в строку , представляющую число в текстовом виде (включая экспоненциальную часть для числа с плавающей запятой ). Числа с плавающей запятой могут быть преобразованы с использованием экспоненциальной записи ( 4.1E+6).

Примечание :

Начиная с PHP 8.0.0, символ десятичной точки всегда равен .. До PHP 8.0.0 символ десятичной точки определяется в языковом стандарте скрипта (категория LC_NUMERIC). См . функцию setlocale() .

Массивы всегда преобразуются в строку "Array" ; из-за этого echo и print не могут сами по себе отображать содержимое массива . Чтобы просмотреть один элемент, используйте такую ​​конструкцию, как echo $arr['foo']. Ниже приведены советы по просмотру всего содержимого.

Чтобы преобразовать object s в строку , необходимо использовать магический метод __toString .

Ресурсы всегда преобразуются в строки со структурой "Resource id #1", где 1 номер ресурса, присвоенный ресурсу PHP во время выполнения. Хотя на точную структуру этой строки нельзя полагаться и она может быть изменена, она всегда будет уникальной для данного ресурса в течение времени жизни выполняемого скрипта (т. е. веб-запроса или процесса CLI) и не будет использоваться повторно. . Чтобы получить тип ресурса , используйте функцию get_resource_type() .

nullвсегда преобразуется в пустую строку.

Как указано выше, прямое преобразование массива , объекта или ресурса в строку не предоставляет никакой полезной информации о значении, кроме его типа. См. функции print_r() и var_dump() для более эффективных средств проверки содержимого этих типов.

Большинство значений PHP также могут быть преобразованы в строки для постоянного хранения. Этот метод называется сериализацией и выполняется функцией serialize() .