Главные новости

PHP: String - строка текста

В этой главе:

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

Синтаксис

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

  • одинарными кавычками
  • двойными кавычками
  • heredoc-синтаксисом
  • nowdoc-синтаксисом

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

Простейший способ определить строку - это заключить ее в одинарные кавычки - апостроф (символ '). Внутри одиночных кавычек разрешается использовать одинарную кавычку, но для этого ее нужно экранировать с помощью обратного слэша (так \'). Также, если необходимо написать саму обратную косую черту (обратный слэш), ее нужно тоже экранировать (\\), все остальные экранированные символы и переменные будут рассматриваться как часть строки:

<?php
echo 'простая строка';
echo 'одну строку
можно разбить на несколько,
чтобы было удобнее читать';
// Выводит: Однажды Арни сказал: "I'll be back"
echo 'Однажды Арни сказал: "I\'ll be back"';
// Выводит: Вы удалили C:\*.*?
echo 'Вы удалили C:\\*.*?';
// Выводит: Вы удалили C:\*.*?
echo 'Вы удалили C:\*.*?';
// Выводит: \n - новая строка
echo '\n - новая строка';
// Выводит: Значения переменных $a и $b не выводятся
echo 'Значения переменных $a и $b не выводятся';
?>

Обратите внимание на данный пример: в строках заключенных в одинарные кавычки можно использовать двойные кавычки.

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

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

Двойные кавычки позволяют использовать внутри строк много специальных управляющих последовательностей (их также называют escape последовательность) в том числе и экранированных символов, которые нельзя использовать в строках, ограниченных одиночными кавычками (апострофами):

Управляющие (Escape) последовательности
Последовательность Значение
\n Перевод строки/новая строка (шестнадцатеричный код 0A)
\r Возврат каретки (шестнадцатеричный код 0D)
\t Горизонтальная табуляция (шестнадцатеричный код 09)
\v Вертикальная табуляция (шестнадцатеричный код 0B)
\e Escape-знак (шестнадцатеричный код 1B)
\f Разрыв страницы (шестнадцатеричный код 0C)
\\ Обратный слэш
\$ Знак доллара
\" Двойная кавычка
\xxx Символ, заданный от 1 до 3 восьмеричных цифр xxx.
\xXX Символ, заданный одной или двумя шестнадцатеричными цифрами XX

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

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

<?php
$str = "hello";
// выводит hello world!
echo "$str world!";
// выводит $str world!
echo '$str world!';
?>

Пример некорректно написанных кавычек:

<?php // пример НЕ правильно расставленных кавычек echo "<h2 class="spec1">Текст заголовка</h2>"; ?>

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

Пример корректной записи:

<?php
// здесь все в порядке
echo "<h2 class=\"spec1\">Текст заголовка</h2>";
echo "<h2 class='spec1'>Текст заголовка</h2>";
?>

Также как и с примером одинарных кавычек: в строках заключенных в двойные кавычки можно использовать одинарные (апострофы).

Heredoc

Третьим способом определения строк является использование heredoc - синтаксиса: <<<. После оператора (<<<) необходимо указать идентификатор (имя идентификатора может быть любым), затем сразу после имени идентификатора должен идти перевод строки. После этого идет сама строка, а потом этот же идентификатор завершает вставку строки. Имя идентификатора может содержать только буквы, цифры и знак подчеркивания, и не должен начинаться с цифры (знак подчеркивания разрешается в качестве первого символа):

<?php
$str = <<<foo
здесь расположены
строки
foo;
echo $str;
?>

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

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

Пример не правильного закрывающего идентификатора:

<?php
$str = <<<foo
это строка
foo;
echo $str;
?>

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

<?php $name = "Арни";
echo <<<foo
Меня зовут "$name".<br>
Здесь выводим заглавную букву 'B': \x42
foo;
?>

И последнее, что стоит упомянуть это то, что открывающий идентификатор Heredoc можно окружить двойными кавычками:

<?php
echo <<<"bar"
Привет, мир!
bar;
?>

Nowdoc

Синтаксис Nowdoc является альтернативой синтаксису с одинарными кавычками (апострафами), так же как Heredoc является альтернативой определения строк двойными кавычками. Так как Nowdoc это альтернатива одинарных кавычек, то и правила для строк у них идентичные, т.е. внутри таких строк не осуществляется никаких подстановок значений вместо имен переменных и все управляющие последовательности символов рассматриваются как обычный текст.

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

<?php $str = <<<'FOO'
Пример текста,
занимающего несколько строк,
с помощью синтаксиса nowdoc.
FOO;
$name = 'Арни';
echo <<<'BAR'
Меня зовут "$name".<br>
Это не должно вывести заглавную 'A': \x41
BAR;
?>

Конкатенация строк

Конкатенация - это сложение/объединение нескольких текстовых строк и переменных в одну строку, как показано в примере ниже. Такое объединение позволяет вам избавиться от лишних инструкций echo. Переменные и текстовые строки объединяются с помощью оператора '.' (точки):

<?php
$str1 = "hello ";
$str2 = "world";
echo 'из двух строк ' . "делаем одну большую<br>";
echo 'Напишем: ' . $str1 . $str2;
?>

Существует еще один сокращенный оператор присваивания с конкатенацией ('.='), он присоединяет значение правого операнда к левому:

<?php
// для примера возьмем следующий код
$str1 = "Hello ";
$str1 = $str1 . "World!"; // $str1 содержит строку "Hello World!"
// предыдущую запись можно переписать таким образом
$str1 = "Hello ";
$str1 .= "World!"; // $str1 содержит строку "Hello World!"
?>

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

Числовое значение определяется по начальной части строки, т.е. если строка начинается с числового значения (цифр), то строка преобразуется в это значение, если строка начинается не с числового символа, то она преобразуется в 0 (ноль).

Если число не содержит какой-либо из символов - '.', 'E' или 'e' (E, e - экспонента), и значение числа помещается в диапазон целых чисел (определенных константой PHP_INT_MAX), например 12345, то строка будет распознана как целое число (integer). Во всех остальных случаях - если число больше, чем определенно константой PHP_INT_MAX, или число содержит какой-либо из символов ('.', 'E' или 'e'), например 1.4e7, то строка будет преобразована в вещественное число (float):

<?php
$num1 = 1 + "10.5"; // float/double (11.5)
$num2 = 1 + "-1.3e3"; // float/double (-1299)
$num3 = 1 + "bob3"; // integer (1)
$num4 = 1 + "10 Книг"; // integer (11)
$num5 = "10.0 Книг " + 1; // float/double (11)
echo "\$num1: " . gettype ($num1) . " ($num1) <br>\n";
echo "\$num2: " . gettype ($num2) . " ($num2) <br>\n";
echo "\$num3: " . gettype ($num3) . " ($num3) <br>\n";
echo "\$num4: " . gettype ($num4) . " ($num4) <br>\n";
echo "\$num5: " . gettype ($num5) . " ($num5) <br>\n";
?>

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

Для явного преобразования в строку используйте (string):

<?php
var_dump((string) 17);
?>

Обработка выражений в строках

Существует два типа синтаксиса обработки выражений в строках - простой и сложный.

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

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

<?php
$car = 'Mazda';
// Получение значения обычной переменной в строке echo "Марка моей машины: $car.";
$juices = array('апельсиновый', 'яблочный');
// Получение значения элемента массива в строке
echo "<br>Я люблю $juices[0] сок.";
class numbers {
public $num = 10;
}
$obj = new numbers();
// Получение значения свойства объекта в строке
echo "<br>Это число $obj->num";
?>

Давайте рассмотрим еще один пример:

<?php
$STR = 'hell'; // Слово hello без буквы 'o'
// добавим к переменной 'o world!', чтобы получилось hello world!
echo "$STRo world!";
?>

Мы ожидаем, что выведется строка 'hello world!', но задумаемся: как PHP может узнать, имели ли мы в виду переменную $STR или переменную $STRo? Очевидно, никак. Запустив данный фрагмент кода, PHP сгенерирует сообщение о том, что переменная $STRo не определена. Если интерпретатор встречает знак доллара ($), он захватывает так много символов, сколько возможно (до первого пробела или конца строки), чтобы сформировать правильное имя переменной. Как же нам поступить в этом случае? Давайте посмотрим:

<?php
$STR = 'hell';
echo $STR . 'o world!'; // используем конкатенацию
echo "{$STR}o world!"; // два других способа использующих сложный синтаксис
echo "${STR}o world!"; // его как раз мы и рассмотрим далее
?>

И так мы узнали, что есть способы преодолеть данную проблему. Каким из них воспользоваться - дело ваше.

Сложный синтаксис

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

Любая переменная простого типа, свойство объекта или элемент массива могут быть обработаны в строке этим синтаксисом. Для этого нужно просто записать выражение как обычно, а затем заключить его в фигурные скобки - { и }. Между фигурными скобками и выражением не должно быть пробелов. Знак доллара может быть расположен как перед фигурной скобкой, так и после нее.

Пример сложного синтаксиса:

<?php
$str = 'здорово';
// Выведет: Это { здорово}, так как использован пробел
echo "Это { $str}";
// Выведет: Это здорово
echo "Это {$str}";
echo "Это ${str}";
// Здесь используется свойство объекта
echo "Ширина {$square->width}см";
// Обратите внимание на апострофы, которые используются для обрамления
// ключа массива внутри конструкции {}. Ключи, заключенные в кавычки,
// работают только с синтаксисом фигурных скобок
echo "Это работает: {$arr['key']}";
?>

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

<?php
$str = 'hello';
$hello = 'world!';
echo "${$str}"; // Выведет world!
?>