EasyТеория5 min

Основы строк

Кавычки, heredoc/nowdoc, интерполяция, конкатенация

Основы строк в PHP

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

Строки в одинарных кавычках — самые простые. В них НЕ работает интерполяция переменных и большинство escape-последовательностей.

<?php
declare(strict_types=1);

$name = 'Alice';

// No variable interpolation
echo 'Hello $name';    // Hello $name (literal dollar sign)
echo 'Hello {$name}';  // Hello {$name} (literal)

// Only two escape sequences work:
echo 'It\'s a test';   // It's a test (escaped single quote)
echo 'Path: C:\\';     // Path: C:\  (escaped backslash)

// Everything else is literal:
echo 'New\nLine';      // New\nLine (literal \n, not newline!)
echo 'Tab\there';      // Tab\there (literal \t, not tab!)

Запомни: В одинарных кавычках работают только ДВА escape-символа: \' (одинарная кавычка) и \\ (обратный слеш). Все остальные escape-последовательности (\n, \t, \r и т.д.) выводятся буквально.

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

В двойных кавычках работает интерполяция переменных и все escape-последовательности.

<?php
declare(strict_types=1);

$name = 'Alice';
$age = 25;

// Variable interpolation
echo "Hello $name";         // Hello Alice
echo "Age: $age years";    // Age: 25 years

// Complex expressions need curly braces
echo "Hello {$name}!";     // Hello Alice!
$arr = ['key' => 'value'];
echo "Value: {$arr['key']}"; // Value: value

// Object properties
$user = new stdClass();
$user->name = 'Bob';
echo "User: {$user->name}"; // User: Bob

// Escape sequences
echo "Newline\n";           // Actual newline
echo "Tab\there";           // Actual tab
echo "Return\r";            // Carriage return
echo "Null byte\0end";     // Null byte
echo "Escape\e";           // Escape character
echo "Octal: \101";        // A (octal 101 = 65 = 'A')
echo "Hex: \x41";          // A (hex 41 = 65 = 'A')
echo "Unicode: \u{0041}";  // A (Unicode codepoint, PHP 7.0+)
echo "Dollar: \$name";     // Dollar: $name (escaped $)
echo "Quote: \"test\"";    // Quote: "test" (escaped ")

Таблица escape-последовательностей

Последовательность Описание
\n Перевод строки (LF)
\r Возврат каретки (CR)
\t Горизонтальная табуляция
\v Вертикальная табуляция
\e Escape (ESC)
\f Подача страницы (form feed)
\\ Обратный слеш
\$ Знак доллара
\" Двойная кавычка
\[0-7]{1,3} Восьмеричный символ
\x[0-9A-Fa-f]{1,2} Шестнадцатеричный символ
\u{[0-9A-Fa-f]+} Unicode codepoint (PHP 7.0+)

Интерполяция переменных

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

<?php
declare(strict_types=1);

$fruit = 'apple';
$count = 5;

echo "$count ${fruit}s";   // 5 apples
echo "$count {$fruit}s";   // 5 apples (same)

// Array access in strings
$data = ['name' => 'Alice', 'city' => 'Moscow'];
echo "Name: $data[name]";      // Name: Alice (no quotes around key!)
echo "Name: {$data['name']}";  // Name: Alice (with curly braces + quotes)

// This is WRONG:
// echo "Name: $data['name']";  // Parse error! Use curly braces

// Nested access requires curly braces
$users = [['name' => 'Alice'], ['name' => 'Bob']];
echo "First: {$users[0]['name']}";  // First: Alice

Ловушка экзамена: Внутри двойных кавычек "$array[key]" (без кавычек вокруг ключа) работает. Но "$array['key']" с кавычками — вызовет ошибку парсинга! Для ключей в кавычках используйте фигурные скобки: "{$array['key']}".

Фигурные скобки (сложный синтаксис)

<?php
declare(strict_types=1);

$name = 'world';

// ${} syntax
echo "Hello ${name}";         // Hello world

// {$} syntax — more flexible
echo "Hello {$name}";         // Hello world

// Variable variables (rare, but exam-relevant)
$varName = 'greeting';
$$varName = 'Hi there';
echo "Value: ${$varName}";    // Value: Hi there

// Method calls (PHP 8.0+ in string interpolation via {$})
class Formatter {
    public function bold(string $text): string {
        return "<b>$text</b>";
    }
}
$fmt = new Formatter();
// echo "Result: {$fmt->bold('test')}";  // Doesn't work in interpolation!
// Method calls are NOT supported in string interpolation

Heredoc

Heredoc работает как двойные кавычки — поддерживает интерполяцию и escape-последовательности.

<?php
declare(strict_types=1);

$name = 'Alice';
$items = ['PHP', 'MySQL', 'Redis'];

// Classic heredoc
$text = <<<EOT
Hello, $name!
Your items:
- {$items[0]}
- {$items[1]}
- {$items[2]}
EOT;

echo $text;

// Heredoc can use any identifier
$html = <<<HTML
<div class="card">
    <h2>$name</h2>
    <p>Escape works: \n</p>
</div>
HTML;

// PHP 7.3+: Flexible closing marker (can be indented)
function getHtml(string $name): string
{
    return <<<HTML
        <div>
            <h1>Hello, $name!</h1>
        </div>
        HTML;  // Indented closing marker — leading whitespace stripped!
}

Запомни: Начиная с PHP 7.3, закрывающий маркер heredoc/nowdoc может быть с отступом. При этом такой же отступ удаляется из ВСЕХ строк тела. Это делает heredoc удобным внутри функций и методов.

Nowdoc

Nowdoc работает как одинарные кавычки — НЕ поддерживает интерполяцию.

<?php
declare(strict_types=1);

$name = 'Alice';

// Nowdoc: opening identifier in SINGLE QUOTES
$text = <<<'EOT'
Hello, $name!
This is literal \n (not a newline).
No {$interpolation} here.
EOT;

echo $text;
// Output:
// Hello, $name!
// This is literal \n (not a newline).
// No {$interpolation} here.

Сравнение типов строк

Особенность Одинарные '' Двойные "" Heredoc <<< Nowdoc <<<'EOT'
Интерполяция Нет Да Да Нет
Escape \n, \t Нет Да Да Нет
Escape \\ Да Да Да Нет
Многострочность Да Да Да Да
Производительность Быстрее Медленнее Как "" Как ''

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

<?php
declare(strict_types=1);

$first = 'Hello';
$second = 'World';

// Concatenation operator
$result = $first . ' ' . $second;  // Hello World

// Concatenation assignment
$text = 'Hello';
$text .= ' World';  // Hello World

// String repeat with str_repeat()
echo str_repeat('=-', 20);  // =-=-=-=-=-=-...

// Concatenation vs interpolation
$name = 'Alice';
$age = 25;

// Both are equivalent:
$msg1 = 'Hello, ' . $name . '! You are ' . $age . ' years old.';
$msg2 = "Hello, $name! You are $age years old.";

// sprintf() — formatted strings
$msg3 = sprintf('Hello, %s! You are %d years old.', $name, $age);

// Performance note: For many concatenations, use implode() or array
$parts = [];
for ($i = 0; $i < 1000; $i++) {
    $parts[] = "item $i";
}
$result = implode(', ', $parts);  // More efficient than repeated .=

Доступ к символам строки

<?php
declare(strict_types=1);

$str = 'Hello';

// Access by index (0-based)
echo $str[0];   // H
echo $str[1];   // e
echo $str[-1];  // o (negative index, from end)

// Modify character
$str[0] = 'J';
echo $str;      // Jello

// Out of bounds
echo $str[100]; // '' (empty string) + Warning in PHP 8.0+

// String length
echo strlen($str);  // 5 (bytes, not characters!)

// For multibyte strings
$str = 'Привет';
echo strlen($str);     // 12 (bytes in UTF-8)
echo mb_strlen($str);  // 6 (actual characters)
echo mb_substr($str, 0, 3); // При (first 3 characters)

Ловушка экзамена: strlen() возвращает количество БАЙТОВ, а не символов! Для UTF-8 строк с кириллицей один символ занимает 2 байта. Используйте mb_strlen() для подсчёта символов. $str[0] на многобайтовой строке вернёт первый БАЙТ, а не первый символ!

Числовые строки

<?php
declare(strict_types=1);

// PHP 8.0+ stricter handling of numeric strings
var_dump(is_numeric('42'));       // true
var_dump(is_numeric(' 42 '));     // true (leading/trailing whitespace OK)
var_dump(is_numeric('42abc'));    // false (trailing non-numeric)
var_dump(is_numeric('0x1A'));     // false (hex NOT numeric since PHP 7.0)
var_dump(is_numeric('1e5'));      // true (scientific notation)
var_dump(is_numeric(''));         // false

// PHP 8.0: Numeric string types
// "Leading-numeric string": "42abc" — triggers E_WARNING in most contexts
// "Non-numeric string": "abc" — triggers TypeError in arithmetic
// "Numeric string": "42" or " 42 " — fully valid

// String to int conversion (PHP 8.0+ strict)
$val = '42abc' + 0;  // 42 + E_WARNING (PHP 8.0+)
// $val = 'abc' + 0; // TypeError in PHP 8.0+!

Вопросы с экзамена ZCE

Проверь себя

5 из 15

Какое утверждение лучше всего описывает разницу между одинарными и двойными кавычками в PHP?

Что выведет `echo "Value: $arr['name']";` где `$arr = ['name' => 'test']`?

Что выведет следующий код? ```php $a = "Apple"; echo <<<'A' pass me that $a A; ```

Какое утверждение лучше всего описывает следующий PHP-код? Обратите внимание: используются обратные кавычки (backticks), а не одинарные. ```php $output = `ls`; ```

Что выведет `echo 'Hello World';`?

Code Challenges

Шифр Цезаря

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

Test Cases

1. Input: "abc", shift=3→ Expected: def
2. Input: "xyz", shift=3→ Expected: abc
3. Input: "Hello, World!", shift=13→ Expected: Uryyb, Jbeyq!
4. Input: "abc", shift=0→ Expected: abc