Язык PHP: что это, как работает и где применяется

Язык PHP: что это, как работает и где применяется Полезное

PHP (рекурсивная аббревиатура PHP: Hypertext Preprocessor) — это скриптовый язык общего назначения с открытым исходным кодом, который чаще всего выполняется на сервере и формирует ответ на HTTP-запрос: HTML-страницу, JSON для API или файл. Его создал Расмус Лердорф: работу он начал в 1994 году, исходный код открыл в 1995-м. Сейчас язык развивает сообщество контрибьюторов при поддержке PHP Foundation. Ниже разберем, как PHP работает, чем современные версии 8.x отличаются от старых, из чего состоит экосистема и в каких задачах язык выбирают, а в каких — нет.

Разведем три понятия, которые называют одним словом «PHP»:

  • язык PHP — синтаксис и правила (типы, классы, функции);
  • интерпретатор — программа, которая исполняет код; эталонная реализация построена на движке Zend Engine;
  • способ запуска (SAPI) — как интерпретатор получает запросы: CLI в терминале, PHP-FPM за веб-сервером nginx или Apache, модуль Apache (mod_php).

Как PHP выполняется на сервере

В классической схеме браузер никогда не получает PHP-код — только результат его работы. Путь одного запроса выглядит так:

  1. Браузер запрашивает /index.php.
  2. Веб-сервер (например, nginx) видит, что это скрипт, и передает запрос в PHP-FPM.
  3. PHP компилирует исходник в опкоды (промежуточный байт-код) и исполняет их. Расширение OPcache кеширует опкоды, поэтому повторные запросы не компилируют файл заново.
  4. Скрипт при необходимости читает базу данных, файлы, внешние API и собирает ответ.
  5. Веб-сервер отдает браузеру готовый HTML или JSON.

Важная особенность классической модели — shared nothing: каждый запрос начинается с чистого состояния, а после ответа переменные и соединения освобождаются. Это упрощает жизнь новичку (утечки памяти не копятся между запросами), но требует хранить состояние вне процесса: в сессиях, базе, Redis.

Это упрощение, и у него есть граница. Существуют долгоживущие среды выполнения (RoadRunner, Swoole, FrankenPHP в worker-режиме), где приложение загружается один раз и обслуживает много запросов. Там снова важны утечки памяти и общее состояние между запросами.

Про «интерпретируемость» тоже нужна точность. Утверждение «PHP выполняет код построчно» устарело: файл сначала целиком компилируется в опкоды, и синтаксическая ошибка в конце файла не даст выполниться даже первой строке. С PHP 8.0 есть еще JIT-компилятор, который переводит горячие участки в машинный код. Он ускоряет в основном вычисления, а веб-запрос обычно упирается в базу и сеть.

Минимальный рабочий пример

Один файл для браузера и терминала, нужен PHP 8.x.

<?php
declare(strict_types=1);

function greet(string $name): string
{
    return 'Привет, ' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . '!';
}

$raw = $_GET['name'] ?? null;
$name = is_string($raw) && $raw !== '' ? $raw : 'мир';

echo greet($name), PHP_EOL;

Сохраните код как index.php и запустите в той же папке встроенный сервер разработки:

php -S localhost:8000

Что увидите:

  • http://localhost:8000/ — «Привет, мир!»;
  • http://localhost:8000/?name=Otus — «Привет, Otus!»;
  • ?name=<b>x</b> — текст выводится как есть, без жирного шрифта: htmlspecialchars превратил < и > в &lt; и &gt;, и браузер не выполнит вставленную разметку.

Из терминала командой php index.php получите «Привет, мир!»: в CLI массив $_GET пуст. Сервер php -S — только для разработки, не для production.

Разбор по строкам:

  • declare(strict_types=1) включает строгую проверку скалярных типов для вызовов из этого файла;
  • string $name и : string — объявления типов параметра и результата;
  • is_string отсекает случай ?name[]=1, когда в $_GET['name'] приходит массив.

Экранирование здесь закрывает только вывод в HTML. Работу с формами, CSRF-токенами и параметризованными SQL-запросами нужно разбирать отдельно: одного htmlspecialchars для защиты приложения недостаточно.

Типизация: динамическая, но с контролем

PHP — язык с динамической типизацией: тип принадлежит значению, а не переменной. Но с версии 7.0 можно объявлять скалярные типы параметров и результатов, а с 7.4 — типы свойств классов. Поведение зависит от режима.

Неверно — рассчитывать на неявное приведение:

<?php
function add(int $a, int $b): int
{
    return $a + $b;
}

var_dump(add("5", 3));

Результат: int(8). В режиме по умолчанию (coercive) строка "5" молча приведена к числу. Если же строка не числовая, например "abc", будет TypeError даже в этом режиме.

Исправление — первой строкой файла добавить declare(strict_types=1);. Тот же вызов теперь падает сразу:

Fatal error: Uncaught TypeError: add(): Argument #1 ($a) must be of type int, string given, called in ... on line ...

Путь и номера строк зависят от среды, а в логе ошибок строка начинается с префикса PHP Fatal error:. Данные извне (форма, JSON) при этом явно проверяют и приводят на входе, например через filter_var($value, FILTER_VALIDATE_INT).

Версии PHP: что важно знать

Версия Год Что принесла
PHP 5.0 2004 Zend Engine 2, полноценная объектная модель
PHP 7.0 2015 новый движок, кратный прирост скорости к 5.6, скалярные типы, ??
PHP 7.4 2019 типизированные свойства, стрелочные функции fn
PHP 8.0 2020 JIT, union-типы, атрибуты, именованные аргументы, match
PHP 8.1 2021 перечисления enum, readonly-свойства, файберы
PHP 8.2 2022 readonly-классы
PHP 8.3 2023 типизированные константы классов
PHP 8.4 2024 property hooks, асимметричная видимость свойств
PHP 8.5 2025 pipe-оператор для цепочек вызовов

Версии PHP 6 не существует: проект с таким номером был закрыт, и после 5.x сразу вышла 7.0. Каждая ветка получает около двух лет активной поддержки и еще два года только исправлений безопасности. По php.net на сентябрь 2026 активно поддерживаются 8.4 и 8.5, при этом у 8.4 активная поддержка заканчивается 31 декабря 2026 года; 8.2 и 8.3 получают только исправления безопасности (8.2 — до конца 2026 года). Поэтому для нового проекта разумный выбор — 8.5, а код на 7.x и 8.0-8.1 работает на ветках без поддержки и требует миграции.

Как выглядит современный PHP 8.1+:

<?php
declare(strict_types=1);

enum Status: string
{
    case Draft = 'draft';
    case Published = 'published';
}

final class Post
{
    public function __construct(
        public readonly string $title,
        public readonly Status $status = Status::Draft,
    ) {}
}

$post = new Post('Обзор PHP');

echo match ($post->status) {
    Status::Draft => "Черновик: {$post->title}",
    Status::Published => "Опубликовано: {$post->title}",
}, PHP_EOL;

Вывод: «Черновик: Обзор PHP». Попытка присвоить $post->title новое значение закончится ошибкой Error: Cannot modify readonly property Post::$title.

Экосистема: Composer, фреймворки, CMS

  • Composer — менеджер зависимостей, пакеты берутся из репозитория Packagist; он же генерирует автозагрузку классов.
  • PSR — стандарты группы PHP-FIG (автозагрузка, стиль кода, HTTP-интерфейсы), благодаря им библиотеки разных авторов совместимы.
  • Фреймворки: Laravel и Symfony, реже Yii и Slim.
  • CMS и платформы: WordPress, Drupal, Joomla, 1С-Битрикс, Magento.
  • Качество кода: PHPUnit для тестов, PHPStan и Psalm для статического анализа.

Где PHP применяют, а где нет

Задача Подходит ли PHP Что обычно берут
Сайт на CMS, интернет-магазин да, основная ниша WordPress, Битрикс, Magento
Бэкенд и REST API да Laravel, Symfony
Фоновые задачи, очереди, cron да CLI-скрипты, Symfony Messenger, Laravel Queue
Realtime (чаты, WebSocket) возможно, но не по умолчанию Swoole, RoadRunner или Node.js/Go
Машинное обучение, анализ данных обычно нет Python
Мобильные и десктопные приложения нет Kotlin, Swift, C#

На PHP написаны MediaWiki (движок Википедии) и WordPress. Крупные компании со временем строят собственные инструменты: Facebook создал HHVM и язык Hack, а во «ВКонтакте» — компилятор KPHP, переводящий PHP-код в C++.

Плюсы и минусы

Плюсы Минусы
низкий порог входа, быстрый старт на хостинге много устаревшего кода и советов эпохи PHP 5
огромная база CMS и готовых решений непоследовательные имена и порядок аргументов в стандартной библиотеке
зрелые фреймворки и Composer неявные приведения типов без strict_types
shared-nothing упрощает масштабирование тяжелые вычисления — не сильная сторона

С чего начать изучение

  1. Установите PHP 8.4 или 8.5 и Composer, проверьте php -v.
  2. Запустите пример выше через php -S.
  3. Освойте синтаксис, массивы, функции, ООП и типы.
  4. Подключите базу через PDO с подготовленными запросами.
  5. Соберите артефакт: небольшое API или блог на Laravel либо Symfony с тестами PHPUnit, выложенное в Git-репозиторий.

Если не получилось:

  • php: command not found — PHP не установлен или не добавлен в PATH;
  • браузер показывает исходный код вместо результата — файл открыт напрямую или сервер не передает .php в интерпретатор;
  • пустая страница — ошибка скрыта настройками, в разработке включите display_errors=On и смотрите лог;
  • Class not found в проекте на Composer — не выполнен composer install или не подключен vendor/autoload.php.

Выводы

  • PHP — серверный скриптовый язык общего назначения, основная ниша — веб: сайты, CMS, API.
  • Код компилируется в опкоды и кешируется OPcache, с 8.0 есть JIT; «построчное выполнение» — устаревшее описание.
  • Динамическую типизацию можно ужесточить объявлениями типов и declare(strict_types=1).
  • Для новых проектов на сентябрь 2026 берут PHP 8.5 (у 8.4 активная поддержка заканчивается в декабре 2026), Composer и Laravel либо Symfony.
  • Для ML, мобильной и десктопной разработки PHP обычно не выбирают.

Где применяется / связь с практикой

Освойте тему на практике

PHP-разработчик чаще всего пишет бэкенд: API, интеграции, фоновые обработчики, доработки CMS. Системно пройти путь от синтаксиса до production-практик — архитектуры, тестов, работы с базой и очередями — можно на курсе «PHP Developer. Professional». Чтобы оценить формат и темы, начните с бесплатных открытых уроков Otus.

FAQ

PHP — это фронтенд или бэкенд?
Бэкенд: код выполняется на сервере, браузер получает уже готовый HTML или JSON.

Можно ли писать на PHP без веб-сервера?
Да, скрипты запускаются в терминале командой php script.php, так пишут утилиты, cron-задачи и обработчики очередей.

Скрыт ли PHP-код от посетителей сайта?
При правильной настройке сервера — да. Но при ошибке конфигурации файл может отдаться как текст, поэтому пароли и ключи держат в переменных окружения или файлах вне корня сайта.

OTUS Журнал