Синтаксис PHP 8.4: переменные, типы, условия, циклы и функции

PHP / Основы

Синтаксис PHP 8.4: переменные, типы, условия, циклы и функции

Основные конструкции современного PHP: строгие типы, строки, массивы, match, циклы, функции, null и безопасный вывод в HTML.

Опубликовано 04.09.2026 5 минут чтения
Содержание статьи

PHP выполняется на сервере и формирует HTTP-ответ. Современный код начинает файл с открывающего тега и строгого режима:

PHP
<?php​declare(strict_types=1);​echo 'Привет, PHP!';​

В файле, содержащем только 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():

PHP
echo get_debug_type($publishedAt); // null​

Не используйте gettype() для пользовательских сообщений без причины: get_debug_type() обычно даёт более точное имя класса.

Строки

Одинарные кавычки почти не интерполируют значения:

PHP
$name = 'Анна';​echo 'Привет, $name'; // Привет, $nameecho "Привет, {$name}"; // Привет, Анна​

Строки объединяются точкой:

PHP
$slug = 'php-' . $articleId;​

Для длины кириллического текста используйте mb_strlen() при доступном mbstring, а не strlen(), которая считает байты.

Массивы

Индексированный массив:

PHP
$categories = ['HTML', 'CSS', 'PHP'];​echo $categories[0]; // HTML​

Ассоциативный:

PHP
$article = [    'title' => 'Синтаксис PHP',    'status' => 'draft',    'views' => 0,];​echo $article['title'];​

Проверьте ключ до чтения:

PHP
$status = is_string($article['status'] ?? null)    ? $article['status']    : 'draft';​

Оператор ?? выбирает fallback для отсутствующего ключа или null.

Условия

PHP
if ($views === 0) {    echo 'Пока нет просмотров';} elseif ($views < 100) {    echo 'Новая публикация';} else {    echo 'Популярная публикация';}​

Используйте строгие сравнения === и !==, особенно для внешнего ввода.

Тернарный оператор подходит для короткого выбора:

PHP
$label = $isPublished ? 'Опубликовано' : 'Черновик';​

Не вкладывайте несколько тернарных операторов в одну строку.

match

match сравнивает строго и возвращает значение:

PHP
$statusLabel = match ($status) {    'draft' => 'Черновик',    'review' => 'На проверке',    'published' => 'Опубликовано',    default => 'Неизвестный статус',};​

В отличие от switch, здесь нет проваливания в следующую ветку и не нужен break.

Циклы

foreach — основной способ перебора массива:

PHP
foreach ($categories as $index => $category) {    echo ($index + 1) . '. ' . $category . PHP_EOL;}​

Цикл for удобен для счётчика:

PHP
for ($page = 1; $page <= 5; $page++) {    echo $page;}​

while выполняется, пока условие истинно:

PHP
$attempts = 0;​while ($attempts < 3) {    $attempts++;}​

Не меняйте массив по ссылке без необходимости. Если использовали foreach ($items as &$item), после цикла выполните unset($item), иначе ссылка останется активной.

Функции и типы

PHP
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-тип:

PHP
function findTitle(int $id): ?string{    return $id === 1 ? 'Введение в PHP' : null;}​

Union-тип уместен, когда функция действительно допускает несколько форм:

PHP
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, если контракт можно описать точнее.

Анонимные и стрелочные функции

PHP
$prices = [100, 250, 500];​$withTax = array_map(    static fn (int $price): int => (int) round($price * 1.2),    $prices,);​

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

Исключения

PHP
try {    $total = calculateTotal(-1, 2);} catch (InvalidArgumentException $error) {    echo 'Не удалось рассчитать сумму.';}​

Не показывайте пользователю $error->getMessage() без анализа: внутреннее сообщение может раскрывать детали. Логируйте техническую информацию и формируйте нейтральный публичный ответ.

PHP внутри HTML

Для шаблонов удобен альтернативный синтаксис:

PHP
<?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-шаблоне всегда учитывайте контекст вывода.

Сообщить об ошибке в статье

Рекомендации редакции

Другие публикации из этого раздела.

Новые материалы

Получайте практические разборы без информационного шума

Одна общая рассылка о новых статьях и инструментах. Адрес будет активироваться только после подтверждения.

Подписка появится после подключения сервиса рассылок и Yandex SmartCaptcha.