Чем отличаются строки в одинарных и двойных кавычках в PHP?
Основное отличие: интерполяция переменных и escape-последовательности
Главное различие между одинарными и двойными кавычками в PHP — это то, как они обрабатывают содержимое строки.
Двойные кавычки (" ") — это "умные" кавычки. PHP анализирует содержимое строки и:
- Подставляет (интерполирует) значения переменных (например,
$name) - Интерпретирует специальные escape-последовательности:
\n(новая строка),\t(табуляция),\\(обратный слеш),\"(двойная кавычка),\$(знак доллара) и другие
Одинарные кавычки (' ') — это "буквальные" кавычки. Почти всё внутри них воспринимается как есть. Исключение — только два escape-символа: \\ (обратный слеш) и \' (одинарная кавычка). Переменные и \n остаются как текст.
Примеры для наглядности
$name = "Мария";
$age = 25;
// Двойные кавычки
echo "Имя: $name, возраст: $age"; // Имя: Мария, возраст: 25
echo "Строка\nс переносом"; // Строка
// с переносом
// Одинарные кавычки
echo 'Имя: $name, возраст: $age'; // Имя: $name, возраст: $age
echo 'Строка\nс переносом'; // Строка\nс переносом
Когда что использовать?
Вот практические рекомендации:
- Используйте одинарные кавычки по умолчанию — они быстрее (PHP не тратит время на анализ), и код становится более предсказуемым. Например:
$message = 'Ошибка: поле обязательно'; - Используйте двойные кавычки, когда нужна интерполяция — это удобнее, чем конкатенация. Вместо
'Привет, ' . $name . '!'можно написать"Привет, $name!" - Для сложных выражений используйте фигурные скобки:
"Значение: {$obj->property}"или"Сумма: {$arr['key']}"
Производительность
Да, разница есть. Строки в одинарных кавычках обрабатываются быстрее, потому что PHP не выполняет интерполяцию и не проверяет escape-последовательности. В реальных проектах эта разница микроскопическая, но в циклах с миллионами операций может быть заметна. Поэтому хорошая практика — использовать одинарные кавычки везде, где не нужна интерполяция.
Heredoc и Nowdoc
Это многострочные варианты:
- Heredoc (<<
— работает как двойные кавычки: интерполирует переменные и обрабатывает escape-последовательности. - Nowdoc (<<<'EOD') — работает как одинарные кавычки: всё буквально, никакой интерполяции.
$name = "Анна";
// Heredoc — как двойные кавычки
$text = <<
Итог
Запомните простое правило: если внутри строки есть переменная или специальный символ (вроде \n), используйте двойные кавычки. Если нет — одинарные. Это сделает код быстрее и чище.
Дополнение: конкатенация как альтернатива интерполяции
Многие разработчики, особенно в больших проектах, предпочитают использовать одинарные кавычки с конкатенацией вместо двойных кавычек с интерполяцией. Это не только быстрее, но и делает код более читаемым, когда выражение сложное.
// Вместо двойных кавычек с интерполяцией
$result = "Пользователь $name (ID: $id) залогинился в " . date('H:i');
// Лучше: одинарные кавычки + конкатенация
$result = 'Пользователь ' . $name . ' (ID: ' . $id . ') залогинился в ' . date('H:i');
// Или ещё чище: sprintf
$result = sprintf('Пользователь %s (ID: %d) залогинился в %s', $name, $id, date('H:i'));
Ещё один важный момент: в двойных кавычках PHP пытается интерполировать всё, что похоже на переменную. Это может привести к неожиданным ошибкам:
$table = "users";
// Ошибка! PHP ищет переменную $table_id
echo "SELECT * FROM $table_id";
// Правильно с фигурными скобками
echo "SELECT * FROM {$table}_id";
// Или просто конкатенация
echo 'SELECT * FROM ' . $table . '_id';
Поэтому, если вы не уверены — используйте одинарные кавычки. Они никогда не подведут.