Строковые типы данных в PHP

Раздел: Основы PHP -> Типы строк

Виды строк в PHP: синтаксис и особенности

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

Наиболее универсальное решение: строки в двойных кавычках

Двойные кавычки ("...") интерполируют переменные и поддерживают стандартные escape-последовательности (\n, \t, \" и др.). Это оптимальный выбор для большинства повседневных задач, когда требуется вставить значение переменной внутрь строки.

$name = 'Анна';
echo "Привет, $name!\n";

виды строк в php (виды строк в php)

Привет, Анна!

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

$price = 150;
echo "Цена: {$price} руб.";
echo "Сумма: {$price * 2} руб.";
Цена: 150 руб.
Сумма: 300 руб.

Типичная ошибка:

Попытка интерполировать сложные выражения без фигурных скобок приводит к синтаксической ошибке или неверному результату. Всегда используйте {} для массивов, объектов или арифметических операций.

Когда нужна максимальная производительность и никакой интерполяции?

Строки в одинарных кавычках ('...') обрабатываются быстрее, так как PHP не проверяет их на наличие переменных. Escape-последовательности работают только для \\ и \'. Этот вариант подходит для статических текстов и констант.

echo 'Это строка с $name, которая не будет заменена.';
echo 'Можно экранировать одинарную кавычку: \'';
Это строка с $name, которая не будет заменена.
Можно экранировать одинарную кавычку: '

Ошибка начинающих:

Использование \n в одинарных кавычках - он не будет интерпретирован как перевод строки, а останется литералом. Если нужен настоящий перевод строки, применяйте двойные кавычки или heredoc.

Как удобно записать многострочный текст с интерполяцией?

Конструкция heredoc (heredoc syntax) позволяет задать многострочную строку без необходимости экранировать кавычки. Она начинается с <<<IDENTIFIER и заканчивается отдельной строкой с тем же идентификатором и точкой с запятой. Переменные внутри heredoc интерполируются.

$title = 'Мой сайт';
$content = <<<HTML
<!DOCTYPE html>
<html>
<head><title>$title</title></head>
<body>
  <h1>Добро пожаловать</h1>
</body>
</html>
HTML;
echo $content;
<!DOCTYPE html>
<html>
<head><title>Мой сайт</title></head>
<body>
  <h1>Добро пожаловать</h1>
</body>
</html>

Распространённая ошибка:

Закрывающий идентификатор (HTML;) должен находиться в самом начале строки, без пробелов и табуляции. Любой отступ вызывает фатальную ошибку. Также нельзя ставить пробел после идентификатора в открывающей строке.

Как получить многострочный текст без интерполяции, как в одинарных кавычках?

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

$code = <<<'PHP'
$variable = 'значение';
if (true) {
    echo "Ничего не интерполируется";
}
PHP;
echo $code;
$variable = 'значение';
if (true) {
    echo "Ничего не интерполируется";
}

Типичная путаница:

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

Цели использования каждого варианта:

  • Одинарные кавычки - для literal-строк, где не нужна интерполяция и escape-последовательности кроме \'.
  • Двойные кавычки - для строк с переменными и стандартными escape-последовательностями.
  • Heredoc - для больших блоков HTML, SQL, шаблонов с интерполяцией.
  • Nowdoc - для хранения PHP-кода, конфигураций или текстов, которые не должны модифицироваться.

Расширенные примеры работы со строками в PHP

Рассмотрим менее очевидные, но полезные приёмы и нюансы, которые помогут глубже понять поведение строк.

Интерполяция сложных выражений с помощью фигурных скобок

Пример
$items = ['яблоко', 'груша', 'слива'];
echo "Вы выбрали: {$items[1]}";
$obj = new stdClass();
$obj->name = 'Тест';
echo "Объект: {$obj->name}";
$calc = 10;
echo "Результат: {$calc + 5}"; // Синтаксическая ошибка, так как фигурные скобки не поддерживают операции. Нужно вычислять отдельно.
Вы выбрали: груша
Объект: Тест
(возникнет ошибка на строке с {$calc + 5})

Решение:

Пример
$result = $calc + 5;
echo "Результат: $result";

Многострочный heredoc с отступами (PHP 7.3+)

Начиная с PHP 7.3, закрывающий идентификатор heredoc/nowdoc может иметь отступы, которые будут удалены из строки.

Пример
$text = <<<'EOF'
        Эта строка
            с отступами
        EOF;
echo $text;
Эта строка
    с отступами

Строки как массивы символов

К символу строки можно обратиться по индексу как к элементу массива. Индексация начинается с 0.

Пример
$str = 'PHP';
echo $str[0]; // P
echo $str[-1]; // H (отрицательный индекс поддерживается с PHP 7.1)
$str[0] = 'J';
echo $str; // JHP

Сравнение производительности одинарных и двойных кавычек

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

Пример
$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    $s = 'Простая строка';
}
echo 'Одинарные: ' . (microtime(true) - $start) . " сек\n";

$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    $s = "Простая строка";
}
echo 'Двойные: ' . (microtime(true) - $start) . " сек";
Одинарные: 0.034 сек
Двойные: 0.040 сек

Конкатенация против интерполяции

Оба подхода валидны, но интерполяция часто читается легче.

Пример
$name = 'Мир';
echo 'Привет, ' . $name . '!';
echo "Привет, $name!";

Форматирование строк с помощью sprintf

Пример
$name = 'Алексей';
$age = 30;
echo sprintf("Имя: %s, возраст: %d лет.", $name, $age);
Имя: Алексей, возраст: 30 лет.

Многобайтовые строки и кодировка UTF-8

Функции strlen и substr работают с байтами, для корректной обработки многобайтовых символов используйте mb_strlen и mb_substr.

Пример
$str = 'Привет';
echo strlen($str); // 12 байт
echo mb_strlen($str, 'UTF-8'); // 6 символов

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

Пример
$num = 123;
$str = (string) $num;
echo $str; // '123'
echo strval(456); // '456'

Nowdoc для хранения шаблонов без интерполяции

Пример
$template = <<<'TEMPLATE'
<div class="user">
  <h2>{$name}</h2>
  <p>Email: {$email}</p>
</div>
TEMPLATE;
echo $template;
<div class="user">
  <h2>{$name}</h2>
  <p>Email: {$email}</p>
</div>

Теперь вы можете использовать эти примеры для написания надёжного и эффективного PHP-кода с любыми строковыми литералами.

Виды строк в PHP - comments

En
виды строк в php (php)