PHP: Конкатенация
В веб-разработке программы постоянно оперируют строками. Все, что мы видим на сайтах, так или иначе представлено в виде текста. Этот текст чаще всего динамический — полученный из разных частей, которые соединяются вместе. Операция соединения строк в программировании называется конкатенацией.
Мы уже знаем о математической операции сложения:
Такая программа выведет на экран 8 — результат работы бинарного оператора + с операндами 5 и 3 .
Можно также «сложить» две строки. Такая программа выведет на экран Dragonstone — результат работы бинарного оператора . с операндами ‘Dragon’ и ‘stone’:
Dragonstone
Склеивание строк всегда происходит в том же порядке, в котором записаны операнды. Левый операнд становится левой частью строки, а правый — правой. Вот еще несколько примеров:
Kingswood print_r('Kings' . 'road'); // => Kingsroad print_r("King's" . 'Landing'); // => King'sLanding
Строки можно склеивать, даже если они записаны с разными кавычками.
Пробел — такой же символ, как и другие, поэтому сколько пробелов поставить в строке — столько и получится в итоговой строке:
King's Landing // Ставим пробел в правой части print_r("King's" . ' Landing'); // => King's Landing
Задание
Выведите на экран
Winter came for the House of Frey.
используя конкатенацию слов.
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Определения
- Конкатенация — операция соединения двух строк. Например, print_r(«King’s » . ‘ Landing’);
Как иначе называется операция сложения строк
Введение

Линейные алгоритмы

Алгоритмы с ветвлением

Алгоритмы с повторением

Одномерный массив (вектор)

Двумерный массив (матрица)

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

Строки

Множества

Записи

Файлы
Строка в языке Паскаль — это, в общем-то, то же самое, что и в «обыденной» жизни. То есть последовательность букв, цифр, знаков препинания и т.д. (иначе говоря, символов) в любом порядке и в любом количестве.
Например, строкой является
В жизни всё закономерно
Следует знать, что Паскаль налагает на использование строк некоторые ограничения. Во-первых, их длина не может превышать 255 символов. Во-вторых, все строки в программе должны быть заключены в апострофы. Т.е.
‘Быть или не быть, вот в чем вопрос!’
И наоборот, все, что стоит между двумя апострофами, является строкой Например
‘a := sin(x) + 5.65’
тоже строка, а не оператор присваивания.
В строках могут использоваться любые символы, которые только Вы сумеете набрать на клавиатуре — даже русские буквы. Не может быть элементом строки только один символ, а именно апостроф. Причины понятны — он отмечает начало и конец строки.
В Паскале строка определяется как произвольная последовательность символов длиной не более 255 символов, заключенная в апострофы.
Тип строка в Паскале имеет два названия. Исторически первое выглядит так:
var s: packed array [1..50] of char;
(т.е. упакованный символьный массив). Впоследствии его заменили на более короткое и понятное:
var s: string[50];
( string в переводе строка). Можете пользоваться любым. Объявление строки максимальной (255) длины еще короче:
var s: string;
Тип string — уникальный в том смысле, что им можно пользоваться одновременно и как единым значением (так, как мы используем целую переменную), и как массивом. Этим строка отличается от простого (неупакованного) символьного массива. Такой массив — обыкновенный, и все ниже сказанное к нему не относится, хотя формально он тоже последовательность символов.
В типе string (но не packed array) элемент с номером 0 используется для хранения длины строки. Сами символы-элементы строки имеют номера от 1 до последнего.
В строке, объявленной как string[50], можно хранить строки любой длины, лишь бы она не превосходила 50-ти.
Работа со строками.
Строки как единое значение можно:
— присваивать
— складывать
— вводить
— выводить
— сравнивать
В отличие от всех других массивов строки вводятся/выводятся одним оператором, без цикла!
Разберем эти действия.
1. Присваивание строк. Присваивать можно любую строку любой, независимо от объявления. Необходимо только следить за тем, чтобы строка «влезла» в строковую переменную. Другими словами, если строковая переменная объявлена как string[50], нельзя запихнуть в нее строку из 100 символов. Также можно присвоить строковой переменной символьную (символ можно назвать строкой из 1-го элемента), но не наоборот. Пример присваивания:
s := ‘String переводится как строка’;
2. Сложение строк. Такое сложение называется конкатенацией или катенацией и применяется для соединения нескольких строк в одну. Например, после выполнения оператора
s := ‘Иван’ + ‘ Васильевич’;
в переменной s будет содержаться строка ‘Иван Васильевич’. Как, надеюсь, Вы уже поняли, операция сложения строк обозначается +. Операция сложения применима только к строкам типа string.
3. Ввод/вывод строк. Для того, чтобы ввести строку s, достаточно написать
readln(s);
А чтобы вывести:
writeln(s);
4. Сравнение строк. К строкам применимы все операции сравнения: = (на равенство), <> (на неравенство) и т.п.
С другой стороны, строка — это массив, и каждый элемент ее — символ. Строку можно обрабатывать поэлементно, иначе говоря, с ней можно обращаться как с обыкновенным символьным массивом. И выполнять любые операции, разрешенные в данном случае (см. Одномерные массивы). В частности, 5-тый символ строки s имеет имя s[5], как обычно.
Впрочем, есть одно очень важное отличие строковых переменных — это массивы переменной длины. Их длина заранее неизвестна, она зависит от того, какую строку мы присвоили строковой переменной. Длина эта хранится в 0-м элементе строковой переменной. Сами символы хранятся в элементах начиная с 1-го. Таким образом, если мы напишем
s := ‘abc’
то s[0] = 3, s[1] = ‘a’, s[2] = ‘b’, s[3] = ‘c’. Остальные элементы строки (4-ый, 5-ый и т.д.), если они есть, неопределены. Скорее всего, там хранится всякий мусор.
Однако не рекомендуется получать длину строки s как s[0]. Для этого в Паскале существует специальная функция length(s). Она возвращает длину строки, переданной ей в качестве параметра. Такой способ безопасней и надежней.
Например, так можно перебрать всю строку по символам (операция, которая часто встречается в задачах):
var s: string[50];
i: integer;
.
begin
.
readln(s);
.
for i := 1 to length(s) do
begin
end;
.
end.
Так как элемент строки имеет тип char, над ним можно производить все операции, разрешенные для этого типа данных.
Стандартные функции работы со строковыми переменными.
В Паскале есть несколько стандартных функций и процедур для работы со строковыми данными. Вот их спецификации:
1. Функция Length( ) : integer
Возвращает длину строки-параметра в символах. Например, length(‘abc’) будет равно 3-м.
Возвращает строку, являющуюся объединением (конкатенацией) всех параметров функции. Эта функция является аналогом операции сложения.
Параметров — произвольное число. Все параметры должны иметь тип
string. Например, concat(‘a’, ‘bc’, ‘!!’) будет ‘abc!!’.
В качестве результата возвращает подстроку , начинающуюся с символа номер длиной символов (как бы вырезает часть ). Параметры и должны быть целыми выражениями. Например, результатом вызова copy(‘1234567890’,3,4) будет строка ‘3456’.
Определяет, содержится ли в . Если да, возвращает номер символа, с которого начинается в . Если нет, возвращает 0. Например, результатом pos(‘123’, ‘ab123cde’) будет 3, т.к. строка ‘123’ в строке ‘ab123cde’ содержится и начинается с позиции 3.
Удаляет из символов, начиная с символа номер . По действию похожа на Copy, но вырезанная часть исчезает из . Параметр должен быть переменной строкового ти-
па, параметры и — выражениями целого типа. Например, пусть строка s = ‘123456789’. Тогда после выполнения процедуры delete(s,5,2) строка s будет равна ‘1234789’.
Вставляет в , начиная с символа номер . Противоположна по действию процедуре Delete. Параметр должен быть строковой переменной, параметр —
целым выражением. Например, пусть строка s = ‘abcde’. Тогда после выполнения процедуры Insert(’12’, s,3) строка s будет равна ‘ab12cde’
Преобразует в числовое значение, которое помещается в переменную . Параметр должен быть целой или вещественной переменной (в зависимости от того, какого типа число содержится в ). Конечно же, должна содержать правильную запись числа. Если при преобразовании возникла ошибка, позиция символа, на котором ‘споткнулись’, заносится в .
Если равен 0, преобразование прошло успешно. Параметр должен быть целой переменной. Например, пусть i и c целые переменные. Тогда после вызова Val(‘123’, i, c) переменная i = 123, а с = 0. После вызова Val(‘1a2’, i, c) значение переменной i не определено, а c = 2 (вторым символом встретилась буква).
Преобразует числовое значение в строковое и помещает его в . Старое значение строки теряется. Параметр должен быть строковой переменной, а параметр — выражением целого либо вещественного типа. В можно задать формат преобразования (как в операторе вывода). Примеры преобразования (s — строка):
Str(4.14, s) s = ‘4.14’
i = 5 Str(i+12, s) s = ’17’
f = 3.1415926 Str(f:5:2, s) s = ‘3.14’
Таковы стандартные функции работы со строковыми переменными. Однако практически все эти действия можно произвести без применения стандартных функций и процедур.
Пример решения задачи со строками.
Разберем задачу на применение строк.
Ввести строку и заменить в ней все пробелы на троеточия.
Как выполнить замену? Надо найти пробел, вырезать его и вставить троеточие. Каждое из данных действий можно осуществить с помощью стандартных функции или процедуры, но можно и без них. Поэтому разберем два варианта решения.
Вариант A. С применением стандартных функций.
Как найти пробел? Для этого есть функция поиска подстроки pos (ничто не мешает считать пробел подстрокой, хотя и маленькой). Когда pos находит подстроку, она возвращает позицию ее начала — что нам и нужно. А если не находит — возвращает 0. Тогда мы должны закончить преобразование строки (пробелов не осталось!). Вырезать пробел можно с помощью процедуры delete, вставить — с помощью insert. Получаем следующий алгоритм:
1. Ввести строку.
2. Найти первый пробел в строке при помощи функции pos.
3. Пока результат pos не равен 0, выполнять шаги:
3.1. Удалить найденный пробел
3.2. Вставить на место пробела троеточие
3.3. Найти следующий пробел
4. Вывести получившуюся строку.
Вариант B. С использованием строки как символьного массива.
Строка — это символьный массив. Значит, найти пробелы можно просто проверяя все символы строки друг за другом. Если символ не пробел — переносим его в строку-результат. Если пробел — заносим в строку-результат троеточие, а пробел игнорируем. И так до конца исходной строки.
В отличие от первого варианта во втором потребуется две строки (дополнительная строка используется для конструирования результата). Алгоритм этого решения можно записать так:
1. Ввести исходную строку.
2. Записать в строку-результат пустую строку.
3. Для i от 1 до конца исходной строки выполнять:
если i-тый символ исходной строки — пробел то добавить к строке-результату троеточие, иначе добавить к строке-результату сам этот символ.
4. Вывести строку-результат.
Почти любая задача на строки допускает решение типа A и типа B. Вам выбирать, какое применить в Вашей программе. Программы на Паскале для этой же задачи выглядят так:
program prim1; < вариант A >
uses crt;
var s: string;
k: byte; < это номер очередного символа-пробела >
begin
clrscr;
textcolor(lightgreen);
writeln(‘Замена в строке пробелов на . ‘);
write(‘Введите строку: ‘);
readln(s);
k := pos(‘ ‘, s);
while k <> 0 do
begin
delete(s, k,1);
insert(‘. ‘, s, k);
k := pos(‘ ‘, s);
end;
writeln(‘Результат: ‘, s);
readkey;
end.
program prim_6a1b; < вариант B >
uses crt;
var s, res: string;
i: byte; < это номер очередного символа >
begin
clrscr;
textcolor(lightgreen);
writeln(‘Замена в строке пробелов на . ‘);
write(‘Введите строку: ‘);
readln(s);
res := »;
for i := 1 to length(s) do
if s[i] = ‘ ‘ then res := res + ‘. ‘
else res := res + s[i];
writeln(‘Результат: ‘, res);
readkey;
end.
ПОЛЕЗНЫЕ СОВЕТЫ.
Базовые операторы, математика
Многие операторы знакомы нам ещё со школы: сложение + , умножение * , вычитание — и так далее.
В этой главе мы начнём с простых операторов, а потом сконцентрируемся на специфических для JavaScript аспектах, которые не проходят в школьном курсе арифметики.
Термины: «унарный», «бинарный», «операнд»
Прежде, чем мы двинемся дальше, давайте разберёмся с терминологией.
- Операнд – то, к чему применяется оператор. Например, в умножении 5 * 2 есть два операнда: левый операнд равен 5 , а правый операнд равен 2 . Иногда их называют «аргументами» вместо «операндов».
- Унарным называется оператор, который применяется к одному операнду. Например, оператор унарный минус «-» меняет знак числа на противоположный:
let x = 1; x = -x; alert( x ); // -1, применили унарный минус
let x = 1, y = 3; alert( y - x ); // 2, бинарный минус вычитает значения
Математика
Поддерживаются следующие математические операторы:
- Сложение + ,
- Вычитание — ,
- Умножение * ,
- Деление / ,
- Взятие остатка от деления % ,
- Возведение в степень ** .
Первые четыре оператора очевидны, а про % и ** стоит сказать несколько слов.
Взятие остатка %
Оператор взятия остатка % , несмотря на обозначение, никакого отношения к процентам не имеет.
Результат a % b – это остаток от целочисленного деления a на b .
alert( 5 % 2 ); // 1, остаток от деления 5 на 2 alert( 8 % 3 ); // 2, остаток от деления 8 на 3 alert( 8 % 4 ); // 0, остаток от деления 8 на 4
Возведение в степень **
Оператор возведения в степень a ** b возводит a в степень b .
В школьной математике мы записываем это как a b .
alert( 2 ** 2 ); // 2² = 4 alert( 2 ** 3 ); // 2³ = 8 alert( 2 ** 4 ); // 2⁴ = 16
Математически, оператор работает и для нецелых чисел. Например, квадратный корень является возведением в степень ½:
alert( 4 ** (1/2) ); // 2 (степень 1/2 эквивалентна взятию квадратного корня)
Сложение строк при помощи бинарного +
Давайте рассмотрим специальные возможности операторов JavaScript, которые выходят за рамки школьной арифметики.
Обычно при помощи плюса ‘+’ складывают числа.
Но если бинарный оператор ‘+’ применить к строкам, то он их объединяет в одну:
let s = "моя" + "строка"; alert(s); // моястрока
Обратите внимание, если хотя бы один операнд является строкой, то второй будет также преобразован в строку.
alert( '1' + 2 ); // "12" alert( 2 + '1' ); // "21"
Как видите, не важно, первый или второй операнд является строкой.
Вот пример посложнее:
alert(2 + 2 + '1' ); // будет "41", а не "221"
Здесь операторы работают один за другим. Первый + складывает два числа и возвращает 4 , затем следующий + объединяет результат со строкой, производя действие 4 + ‘1’ = ’41’ .
Сложение и преобразование строк — это особенность бинарного плюса + . Другие арифметические операторы работают только с числами и всегда преобразуют операнды в числа.
Например, вычитание и деление:
alert( 6 - '2' ); // 4, '2' приводится к числу alert( '6' / '2' ); // 3, оба операнда приводятся к числам
Приведение к числу, унарный +
Плюс + существует в двух формах: бинарной, которую мы использовали выше, и унарной.
Унарный, то есть применённый к одному значению, плюс + ничего не делает с числами. Но если операнд не число, унарный плюс преобразует его в число.
// Не влияет на числа let x = 1; alert( +x ); // 1 let y = -2; alert( +y ); // -2 // Преобразует не числа в числа alert( +true ); // 1 alert( +"" ); // 0
На самом деле это то же самое, что и Number(. ) , только короче.
Необходимость преобразовывать строки в числа возникает очень часто. Например, обычно значения полей HTML-формы — это строки. А что, если их нужно, к примеру, сложить?
Бинарный плюс сложит их как строки:
let apples = "2"; let oranges = "3"; alert( apples + oranges ); // "23", так как бинарный плюс объединяет строки
Поэтому используем унарный плюс, чтобы преобразовать к числу:
let apples = "2"; let oranges = "3"; // оба операнда предварительно преобразованы в числа alert( +apples + +oranges ); // 5 // более длинный вариант // alert( Number(apples) + Number(oranges) ); // 5
С точки зрения математика, такое изобилие плюсов выглядит странным. Но с точки зрения программиста тут нет ничего особенного: сначала выполнятся унарные плюсы, которые приведут строки к числам, а затем бинарный ‘+’ их сложит.
Почему унарные плюсы выполнились до бинарного сложения? Как мы сейчас увидим, дело в их приоритете.
Приоритет операторов
В том случае, если в выражении есть несколько операторов – порядок их выполнения определяется приоритетом, или, другими словами, существует определённый порядок выполнения операторов.
Из школы мы знаем, что умножение в выражении 1 + 2 * 2 выполнится раньше сложения. Это как раз и есть «приоритет». Говорят, что умножение имеет более высокий приоритет, чем сложение.
Скобки важнее, чем приоритет, так что, если мы не удовлетворены порядком по умолчанию, мы можем использовать их, чтобы изменить приоритет. Например, написать (1 + 2) * 2 .
В JavaScript много операторов. Каждый оператор имеет соответствующий номер приоритета. Тот, у кого это число больше, – выполнится раньше. Если приоритет одинаковый, то порядок выполнения – слева направо.
Отрывок из таблицы приоритетов (нет необходимости всё запоминать, обратите внимание, что приоритет унарных операторов выше, чем соответствующих бинарных):
| Приоритет | Название | Обозначение |
|---|---|---|
| … | … | … |
| 15 | унарный плюс | + |
| 15 | унарный минус | — |
| 14 | возведение в степень | ** |
| 13 | умножение | * |
| 13 | деление | / |
| 12 | сложение | + |
| 12 | вычитание | — |
| … | … | … |
| 2 | присваивание | = |
| … | … | … |
Так как «унарный плюс» имеет приоритет 15 , который выше, чем 12 у «сложения» (бинарный плюс), то в выражении «+apples + +oranges» сначала выполнятся унарные плюсы, а затем сложение.
Присваивание
Давайте отметим, что в таблице приоритетов также есть оператор присваивания = . У него один из самых низких приоритетов: 2 .
Именно поэтому, когда переменной что-либо присваивают, например, x = 2 * 2 + 1 , то сначала выполнится арифметика, а уже затем произойдёт присваивание = с сохранением результата в x .
let x = 2 * 2 + 1; alert( x ); // 5
Присваивание = возвращает значение
Тот факт, что = является оператором, а не «магической» конструкцией языка, имеет интересные последствия.
Большинство операторов в JavaScript возвращают значение. Для некоторых это очевидно, например сложение + или умножение * . Но и оператор присваивания не является исключением.
Вызов x = value записывает value в x и возвращает его.
Благодаря этому присваивание можно использовать как часть более сложного выражения:
let a = 1; let b = 2; let c = 3 - (a = b + 1); alert( a ); // 3 alert( c ); // 0
В примере выше результатом (a = b + 1) будет значение, которое присваивается переменной a (то есть 3 ). Потом оно используется для дальнейших вычислений.
Забавное применение присваивания, не так ли? Нам нужно понимать, как это работает, потому что иногда это можно увидеть в JavaScript-библиотеках.
Однако писать самим в таком стиле не рекомендуется. Такие трюки не сделают ваш код более понятным или читабельным.
Присваивание по цепочке
Рассмотрим ещё одну интересную возможность: цепочку присваиваний.
let a, b, c; a = b = c = 2 + 2; alert( a ); // 4 alert( b ); // 4 alert( c ); // 4
Такое присваивание работает справа налево. Сначала вычисляется самое правое выражение 2 + 2 , и затем результат присваивается переменным слева: c , b и a . В конце у всех переменных будет одно значение.
Опять-таки, чтобы код читался легче, лучше разделять подобные конструкции на несколько строчек:
c = 2 + 2; b = c; a = c;
Польза от такого стиля особенно ощущается при быстром просмотре кода.
Сокращённая арифметика с присваиванием
Часто нужно применить оператор к переменной и сохранить результат в ней же.
let n = 2; n = n + 5; n = n * 2;
Эту запись можно укоротить при помощи совмещённых операторов += и *= :
let n = 2; n += 5; // теперь n = 7 (работает как n = n + 5) n *= 2; // теперь n = 14 (работает как n = n * 2) alert( n ); // 14
Подобные краткие формы записи существуют для всех арифметических и побитовых операторов: /= , -= , **= и так далее.
Вызов с присваиванием имеет в точности такой же приоритет, как обычное присваивание, то есть выполнится после большинства других операций:
let n = 2; n *= 3 + 5; alert( n ); // 16 (сначала выполнится правая часть, выражение идентично n *= 8)
Инкремент/декремент
Одной из наиболее частых числовых операций является увеличение или уменьшение на единицу.
Для этого существуют даже специальные операторы:
-
Инкремент ++ увеличивает переменную на 1:
let counter = 2; counter++; // работает как counter = counter + 1, просто запись короче alert( counter ); // 3
let counter = 2; counter--; // работает как counter = counter - 1, просто запись короче alert( counter ); // 1
Инкремент/декремент можно применить только к переменной. Попытка использовать его на значении, типа 5++, приведёт к ошибке.
Операторы ++ и — могут быть расположены не только после, но и до переменной.
- Когда оператор идёт после переменной — это «постфиксная форма»: counter++ .
- «Префиксная форма» — это когда оператор идёт перед переменной: ++counter .
Обе эти инструкции делают одно и то же: увеличивают counter на 1 .
Есть ли разница между ними? Да, но увидеть её мы сможем, только если будем использовать значение, которое возвращают ++/— .
Давайте проясним этот момент. Как мы знаем, все операторы возвращают значение. Операторы инкремента/декремента не исключение. Префиксная форма возвращает новое значение, в то время как постфиксная форма возвращает старое (до увеличения/уменьшения числа).
Чтобы увидеть разницу, вот небольшой пример:
let counter = 1; let a = ++counter; // (*) alert(a); // 2
В строке (*) префиксная форма ++counter увеличивает counter и возвращает новое значение 2 . Так что alert покажет 2 .
Теперь посмотрим на постфиксную форму:
let counter = 1; let a = counter++; // (*) меняем ++counter на counter++ alert(a); // 1
В строке (*) постфиксная форма counter++ также увеличивает counter , но возвращает старое значение (которое было до увеличения). Так что alert покажет 1 .
-
Если результат оператора не используется, а нужно только увеличить/уменьшить переменную, тогда без разницы, какую форму использовать:
let counter = 0; counter++; ++counter; alert( counter ); // 2, обе строки сделали одно и то же
Строки — Основы PHP
В этом уроке мы разберем, что такое строки, зачем для них нужны одинарные и двойные кавычки. Также узнаем, что такое экранирующие последовательности и конкатенация.
Что такое строка
Какие из этих пяти вариантов — строки?
'Hello' 'Goodbye' 'G' ' ' ''
С первыми двумя все понятно, это точно строки, мы уже работали с подобными конструкциями и говорили, что строки – это наборы символов.
Любой одиночный символ в кавычках — это строка, например ‘G’ . Пустая строка » — это тоже строка. То есть строкой мы считаем все, что находится внутри кавычек, даже если это пробел, один символ или вообще отсутствие символов.
Ранее в уроках мы записывали строки в одинарных кавычках, но можно использовать и двойные:
print_r("Dracarys!");
Разберем, почему у обозначения строки есть два способа.
Зачем нужны двойные кавычки
Представим, что нам нужно напечатать строчку dragon’s mother . Апостроф перед буквой s — это такой же символ, как одинарная кавычка. Попробуем:
print_r('Dragon's mother'); // PHP Parse error: syntax error, unexpected 's' (T_STRING), expecting ',' or ')'
Такая программа не будет работать. С точки зрения PHP строчка началась с одинарной кавычки, а потом закончилась после буквы n. Дальше были символы s mother без кавычек — значит, это не строка. А потом была одна открывающая строку кавычка, которая так и не закрылась: ‘); . Этот код синтаксически некорректен.
Здесь помогут двойные кавычки. Такой вариант программы отработает корректно:
print_r("Dragon's mother");
Теперь интерпретатор знает, что строка началась с двойной кавычки, значит, завершиться должна на двойной кавычке. А одинарная кавычка внутри стала частью строки.
Верно и обратное. Если внутри строки мы хотим использовать двойные кавычки, то саму строку надо делать в одинарных. Причем количество кавычек внутри самой строки неважно.
Теперь представим, что мы хотим создать такую строку:
Dragon's mother said "No"
В ней есть и одинарные, и двойные кавычки. В этой ситуации нужно указать интерпретатору, что нужно считать каждую кавычку частью строки, а не началом или концом.
Для этого экранируют специальные символы. В нашем случае это символ, который является признаком конца и начала строки, — либо одинарная кавычка, либо двойная, в зависимости от ситуации. Для экранирования используется обратный слеш \ .
// Экранируется только ", так как в этой ситуации // двойные кавычки имеют специальное значение print_r("Dragon's mother said \"No\""); // => Dragon's mother said "No"
Нам нужно было добавить \ для двойных кавычек, но не для апострофа, потому что сама строка создана с двойными кавычками. Если бы строка создавалась с одинарными кавычками, то символ экранирования нужен был бы перед апострофом, но не перед двойными кавычками.
// \ выводится, если после него идет обычный, // а не специальный символ print_r("Death is \so terribly final"); // => Death is \so terribly final
Также нам может понадобиться вывести сам обратный слэш:
print_r("\\"); // => \
Это тоже можно сделать через экранирование, но уже самого себя.
Что такое экранирующие последовательности
Иногда нам необходимо расположить несколько строк друг за другом. Для этого нужно сказать интерпретатору «нажать на Enter» — сделать перевод строки после вопросительного знака. Это можно сделать с помощью символа перевода строки — \n :
print_r("- Are you hungry?\n- Aaaarrrgh!");
- Are you hungry? - Aaaarrrgh!
\n — это специальный символ. В литературе его часто обозначают как LF (Line Feed). С точки зрения компьютера — это один невидимый символ перевода строки:
// Мы это не изучали, но вы должны знать правду // Ниже код, который возвращает длину строки strlen("a"); // 1 strlen("\n"); // 1 . strlen("\n\n"); // 2 .
\n — это способ записать символ перевода строки, но сам перевод строки — это один невидимый символ. Так как количество знаков на клавиатуре ограничено и отдано под самые важные, то все специальные символы реализуются в виде таких обозначений.
Символ перевода строки не является специфичным для программирования. Во многих редакторах есть опция, которая позволяет включить отображение невидимых символов. С ее помощью можно понять, где они находятся. Хотя это всего лишь схематичное отображение, у этих символов нет графического представления, они невидимые.
\n — это пример экранирующей последовательности (escape sequence). Их еще называют управляющими конструкциями. Таких символов не один десяток, но в программировании часто встречаются всего несколько. Программистам часто нужно использовать перевод строки \n для правильного форматирования текста.
Экранирующие последовательности вроде \n работают только внутри двойных кавычек.
Если нам понадобится вывести \n именно как текст, то можно воспользоваться уже известным нам способом экранирования — добавить еще один \ в начале. В итоге последовательность \\n отобразится как символы \ и n , которые идут друг за другом.
В Windows для перевода строк по умолчанию используется \r\n . Такая комбинация хорошо работает только в Windows, но создает проблемы при переносе в другие системы. Например, когда в команде разработчиков есть пользователи как Windows, так и Linux.
Последовательность \r\n имеет разную трактовку в зависимости от выбранной кодировки. Это мы рассмотрим позже. По этой причине в среде разработчиков принято всегда использовать \n без \r , так как LF всегда трактуется одинаково и отлично работает в любой системе. Поэтому нужно настроить свой редактор на использование \n .
Что такое конкатенация
В веб-разработке программы постоянно оперируют строками. Все, что мы видим на сайтах, так или иначе представлено в виде текста. Этот текст чаще всего динамический — полученный из разных частей, которые соединяются вместе. Операция соединения строк в программировании называется конкатенацией.
Мы уже знаем о математической операции сложения:
print_r(5 + 3); // => 8
Такая программа выведет на экран 8 — результат работы бинарного оператора + с операндами 5 и 3 .
Можно также «сложить» две строки. Такая программа выведет на экран Dragonstone — результат работы бинарного оператора . с операндами ‘Dragon’ и ‘stone’:
print_r('Dragon' . 'stone'); // => Dragonstone
Склеивание строк всегда происходит в том же порядке, в котором записаны операнды. Левый операнд становится левой частью строки, а правый — правой. Вот еще несколько примеров:
print_r('Kings' . 'wood'); // => Kingswood print_r('Kings' . 'road'); // => Kingsroad print_r("King's" . 'Landing'); // => King'sLanding
Строки можно склеивать, даже если они записаны с разными кавычками.
Пробел — такой же символ, как и другие, поэтому сколько пробелов поставить в строке — столько и получится в итоговой строке:
// Ставим пробел в левой части print_r("King's " . 'Landing'); // => King's Landing // Ставим пробел в правой части print_r("King's" . ' Landing'); // => King's Landing
Выводы
В этом уроке мы разобрали, что такое строки — это любой одиночный символ в кавычках. Кавычки могут быть одинарными и двойными. Выбор количества кавычек зависит от того, какие кавычки могут использоваться внутри строки.
Если в строке есть и одинарные, и двойные кавычки, нужно указать интерпретатору, что нужно считать каждую кавычку частью строки, а не началом или концом. Для этого экранируют специальные символы.
Если нужно сделать перевод строки, то для этого используется символ \n , который является примером экранирующей последовательности. Экранирующие последовательности работают только внутри двойных кавычек.
Также мы узнали, что в коде можно не только складывать цифры, но и строки. Операция соединения строк в программировании называется конкатенацией.
Дополнительные материалы
- REPL для экспериментов
- История перевода строки
- Что такое кодировки?
![]()
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Об обучении на Хекслете
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Урок «Как эффективно учиться на Хекслете»
- Вебинар « Как самостоятельно учиться »
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
