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

В этой главе:

  • Синтаксис
  • Одинарные кавычки
  • Двойные кавычки
  • Heredoc
  • Nowdoc
  • Конкатенация строк
  • Преобразование строк в числа
  • Явное преобразование в строку
  • Обработка выражений в строках

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

Синтаксис

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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

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

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

1
2
3
4
5
6
7
8
9
10
11
<?php
 
  $str = "hello";
 
  // выводит hello world!
  echo "$str world!";
 
  // выводит $str world!
  echo '$str world!';
 
?>

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

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

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

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

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

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

Heredoc

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

1
2
3
4
5
6
7
8
9
10
<?php
 
  $str = <<<foo
    здесь расположены
    строки
  foo;
  
  echo $str;
  
?>

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

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

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

1
2
3
4
5
6
7
8
9
<?php
 
  $str = <<<foo
    это строка
    foo;
  
  echo $str;
  
?>

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

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

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

1
2
3
4
5
6
7
<?php
 
  echo <<<"bar"
    Привет, мир!
  bar;
 
?>

Nowdoc

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
 
  $str = <<<'FOO'
    Пример текста,
    занимающего несколько строк,
    с помощью синтаксиса nowdoc.
  FOO;
 
  $name = 'Арни';
 
  echo <<<'BAR'
    Меня зовут "$name".<br>
    Это не должно вывести заглавную 'A': \x41
  BAR;
 
?>

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
<?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):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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):

1
2
3
4
5
<?php
 
  var_dump((string) 17);
 
?>

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
 
  $car = 'Mazda';
   
  // Получение значения обычной переменной в строке
  echo "Марка моей машины: $car.";
 
 
  $juices = array('апельсиновый', 'яблочный');
   
  // Получение значения элемента массива в строке
  echo "<br>Я люблю $juices[0] сок.";
 
 
  class numbers {
    public $num = 10;
  }
 
  $obj = new numbers();
   
  // Получение значения свойства объекта в строке
  echo "<br>Это число $obj->num";
 
?>

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

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
 
  $str = 'здорово';
 
  // Выведет: Это { здорово}, так как использован пробел
  echo "Это { $str}";
 
  // Выведет: Это здорово
  echo "Это {$str}";
  echo "Это ${str}";
 
  // Здесь используется свойство объекта
  echo "Ширина {$square->width}см";
 
  // Обратите внимание на апострофы, которые используются для обрамления
  // ключа массива внутри конструкции {}. Ключи, заключенные в кавычки,
  // работают только с синтаксисом фигурных скобок
  echo "Это работает: {$arr['key']}";
   
?>

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

1
2
3
4
5
6
7
8
<?php
 
  $str = 'hello';
  $hello = 'world!';
   
  echo "${$str}"// Выведет world!
   
?>