PHP / Основы
Синтаксис PHP 8.4: переменные, типы, условия, циклы и функции
Основные конструкции современного PHP: строгие типы, строки, массивы, match, циклы, функции, null и безопасный вывод в HTML.
Содержание статьи
PHP выполняется на сервере и формирует HTTP-ответ. Современный код начинает файл с открывающего тега и строгого режима:
<?phpdeclare(strict_types=1);echo 'Привет, PHP!';В файле, содержащем только PHP, закрывающий ?> обычно опускают, чтобы случайный пробел после него не попал в ответ.
Переменные и типы
Имя переменной начинается с $:
$title = 'Основы PHP';$views = 1_250;$rating = 4.8;$isPublished = true;$publishedAt = null;Основные типы: string, int, float, bool, array, object, null, resource, callable, iterable. Тип можно проверить через get_debug_type():
echo get_debug_type($publishedAt); // nullНе используйте gettype() для пользовательских сообщений без причины: get_debug_type() обычно даёт более точное имя класса.
Строки
Одинарные кавычки почти не интерполируют значения:
$name = 'Анна';echo 'Привет, $name'; // Привет, $nameecho "Привет, {$name}"; // Привет, АннаСтроки объединяются точкой:
$slug = 'php-' . $articleId;Для длины кириллического текста используйте mb_strlen() при доступном mbstring, а не strlen(), которая считает байты.
Массивы
Индексированный массив:
$categories = ['HTML', 'CSS', 'PHP'];echo $categories[0]; // HTMLАссоциативный:
$article = [ 'title' => 'Синтаксис PHP', 'status' => 'draft', 'views' => 0,];echo $article['title'];Проверьте ключ до чтения:
$status = is_string($article['status'] ?? null) ? $article['status'] : 'draft';Оператор ?? выбирает fallback для отсутствующего ключа или null.
Условия
if ($views === 0) { echo 'Пока нет просмотров';} elseif ($views < 100) { echo 'Новая публикация';} else { echo 'Популярная публикация';}Используйте строгие сравнения === и !==, особенно для внешнего ввода.
Тернарный оператор подходит для короткого выбора:
$label = $isPublished ? 'Опубликовано' : 'Черновик';Не вкладывайте несколько тернарных операторов в одну строку.
match
match сравнивает строго и возвращает значение:
$statusLabel = match ($status) { 'draft' => 'Черновик', 'review' => 'На проверке', 'published' => 'Опубликовано', default => 'Неизвестный статус',};В отличие от switch, здесь нет проваливания в следующую ветку и не нужен break.
Циклы
foreach — основной способ перебора массива:
foreach ($categories as $index => $category) { echo ($index + 1) . '. ' . $category . PHP_EOL;}Цикл for удобен для счётчика:
for ($page = 1; $page <= 5; $page++) { echo $page;}while выполняется, пока условие истинно:
$attempts = 0;while ($attempts < 3) { $attempts++;}Не меняйте массив по ссылке без необходимости. Если использовали foreach ($items as &$item), после цикла выполните unset($item), иначе ссылка останется активной.
Функции и типы
function calculateTotal(int $price, int $quantity): int{ if ($price < 0 || $quantity < 1) { throw new InvalidArgumentException('Некорректная цена или количество.'); } return $price * $quantity;}$total = calculateTotal(1_500, 3);strict_types=1 влияет на скалярные преобразования при вызовах из этого файла, но не превращает PHP в систему валидации. Значение $_POST всё равно нужно разобрать и проверить до передачи.
Nullable-тип:
function findTitle(int $id): ?string{ return $id === 1 ? 'Введение в PHP' : null;}Union-тип уместен, когда функция действительно допускает несколько форм:
function normalizeId(int|string $value): int{ $id = filter_var($value, FILTER_VALIDATE_INT); if (!is_int($id) || $id < 1) { throw new InvalidArgumentException('Некорректный ID.'); } return $id;}Не расширяйте тип до mixed, если контракт можно описать точнее.
Анонимные и стрелочные функции
$prices = [100, 250, 500];$withTax = array_map( static fn (int $price): int => (int) round($price * 1.2), $prices,);Стрелочная функция автоматически захватывает внешние переменные по значению. Для нескольких выражений используйте обычное замыкание.
Исключения
try { $total = calculateTotal(-1, 2);} catch (InvalidArgumentException $error) { echo 'Не удалось рассчитать сумму.';}Не показывайте пользователю $error->getMessage() без анализа: внутреннее сообщение может раскрывать детали. Логируйте техническую информацию и формируйте нейтральный публичный ответ.
PHP внутри HTML
Для шаблонов удобен альтернативный синтаксис:
<?php if ($articles === []): ?> <p>Статей пока нет.</p><?php else: ?> <ul> <?php foreach ($articles as $article): ?> <li> <?= htmlspecialchars($article['title'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ?> </li> <?php endforeach; ?> </ul><?php endif; ?>Короткий <?= ... ?> эквивалентен <?php echo ...; ?>. Недоверенный текст экранируется в момент вывода.
Что запомнить
Используйте declare(strict_types=1), точные типы аргументов и результатов, строгие сравнения и раннюю валидацию. match упрощает выбор значения, foreach — перебор, а функции должны иметь небольшой явный контракт. В HTML-шаблоне всегда учитывайте контекст вывода.