Строка представляет собой последовательность символов, где символ совпадает с байтом. Это означает, что 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) |
\e | escape (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() .
0 комментариев