Основы строк в 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+!