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-код — только результат его работы. Путь одного запроса выглядит так:
- Браузер запрашивает
/index.php. - Веб-сервер (например, nginx) видит, что это скрипт, и передает запрос в PHP-FPM.
- PHP компилирует исходник в опкоды (промежуточный байт-код) и исполняет их. Расширение OPcache кеширует опкоды, поэтому повторные запросы не компилируют файл заново.
- Скрипт при необходимости читает базу данных, файлы, внешние API и собирает ответ.
- Веб-сервер отдает браузеру готовый 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превратил<и>в<и>, и браузер не выполнит вставленную разметку.
Из терминала командой 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 упрощает масштабирование | тяжелые вычисления — не сильная сторона |
С чего начать изучение
- Установите PHP 8.4 или 8.5 и Composer, проверьте
php -v. - Запустите пример выше через
php -S. - Освойте синтаксис, массивы, функции, ООП и типы.
- Подключите базу через PDO с подготовленными запросами.
- Соберите артефакт: небольшое 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-код от посетителей сайта?
При правильной настройке сервера — да. Но при ошибке конфигурации файл может отдаться как текст, поэтому пароли и ключи держат в переменных окружения или файлах вне корня сайта.



