PHP — это распространенный мультипарадигменный скриптовый язык программирования с открытым исходным кодом, предназначенный преимущественно для веб-разработки и создания динамических веб-приложений. Название языка является рекурсивным акронимом от «PHP: Hypertext Preprocessor» (препроцессор гипертекста), однако первоначально оно расшифровывалось как «Personal Home Page tools» (инструменты для личной домашней страницы). Язык жестко специализирован для работы в среде веб-серверов и является одним из признанных индустриальных стандартов при разработке сайтов.

История создания и эволюция версий

Разработка языка была начата в 1993 году датским программистом Расмусом Лердорфом. Первоначально проект представлял собой простой набор скриптов, созданных Лердорфом для автоматизации и управления собственной персональной веб-страницей (отсюда историческое название Personal Home Page). В 1995 году состоялся первый публичный релиз языка. В этот период язык использовался для простейших задач веб-программирования и обработки HTML-страниц.

В 1997 году к разработке присоединились два израильских программиста из Тель-Авива — Энди Гутманс и Зив Сураски. Они полностью переписали ядро интерпретатора, что привело к выпуску PHP 3 в июне 1998 года. Именно с этой версии язык приобрел свою современную форму, стал поддерживать модульность и перешел в свободную разработку сообществом, что вызвало стремительный рост его популярности.

Дальнейшая эволюция языка проходила через несколько ключевых версий:

  • Версия 4 (май 2000 года) — существенное улучшение производительности и внедрение буферизации вывода.
  • Версия 5 (2004 год) — обновление ядра, повышение эффективности интерпретатора и полноценное внедрение объектно-ориентированного программирования с ориентацией на парадигмы языка Java.
  • Версия 6 — находилась в разработке с 2006 года, однако в итоге была признана тупиковой ветвью и закрыта.
  • Версия 7 (2014—2015 годы, включая популярную версию 7.4 в 2019 году) — масштабное обновление безопасности и производительности. Добавлен интерфейс внешних функций (FFI).
  • Версия 8 (2020 год) — современный стандарт языка, продолжающий курс на повышение безопасности и строгой типизации.

Несмотря на активное развитие версии 8, в индустрии сохраняется ситуация, при которой значительная часть проектов (до 50% по оценкам 2024 года) продолжает работать на устаревшей ветке PHP 7, что несет в себе риски для безопасности.

Архитектура и вычислительная среда

Скрипты на PHP являются кроссплатформенными. Жизненный цикл выполнения кода интерпретатором строго регламентирован и состоит из следующих этапов: лексический анализ исходного кода, генерация токенов, синтаксический анализ, генерация промежуточного байт-кода (OP-кода), оптимизация и, наконец, непосредственное выполнение OP-кода с учетом особенностей целевой аппаратной платформы.

Управление оперативной памятью в языке осуществляется автоматически. Встроенный сборщик мусора самостоятельно освобождает и возвращает в систему все выделенные ресурсы сразу после завершения работы скрипта.

Настройка поведения транслятора осуществляется через глобальный конфигурационный файл (php.ini). Внесение изменений в данный файл позволяет управлять ограничениями на выделяемую оперативную память, временем выполнения скриптов, ведением журналов ошибок и даже активировать скрытые функции (так называемые «пасхалки», выводящие специальные изображения по системным GET-запросам).

Ввиду высокой популярности языка крупными технологическими компаниями были разработаны альтернативные компиляторы для повышения производительности. К наиболее известным примерам относятся транслятор HipHop от корпорации Facebook (генерирующий код на языке C++) и KPHP, разработанный специалистами социальной сети ВКонтакте.

Синтаксис и парадигмы программирования

Синтаксис PHP сформировался под сильным влиянием языка C, что существенно упрощает его освоение для специалистов с классическим техническим образованием. Кроме того, в языке отчетливо прослеживается влияние языка Perl (в частности, в конструкциях обхода массивов foreach).

Язык был спроектирован так, чтобы его код можно было напрямую встраивать в гипертекстовую разметку HTML. Интерпретатор начинает обрабатывать программный код только внутри специальных ограничительных тегов. Все, что находится за пределами этих тегов, выводится веб-сервером без изменений.

Концептуальный пример интеграции и базового синтаксиса:

 <html>
 <body>
     <?php
         // Вывод строки
         echo "Привет, мир!";
     ?>
 </body>
 </html>

Для еще более лаконичного вывода данных в язык встроена сокращенная конструкция с использованием знака равенства (например,

<?= "Привет, мир!" ?>

).

Инструкции в языке разделяются точкой с запятой. Комментарии поддерживаются в трех стилях: в стиле C, C++ и в стиле операционных систем Unix. Имена переменных чувствительны к регистру, однако имена классов, методов классов и функций к регистру нечувствительны.

Типы данных и переменные

PHP является языком с динамической типизацией: тип переменной определяется автоматически в зависимости от контекста ее использования. При необходимости разработчик может принудительно включить строгий режим типизации, блокирующий неявные преобразования.

Все переменные в языке начинаются с обязательного символа доллара ($). Объявлять переменные заранее не требуется. Типы данных в PHP делятся на следующие категории:

  • Скалярные типы: целые числа (integer), числа с плавающей запятой (float), логический тип (boolean) и строки (string).
  • Нескалярные типы: массивы (array), объекты (object).
  • Специальные типы: ресурсы (resource) и неопределенное значение (null).

Массивы в PHP фактически представляют собой упорядоченные хеш-таблицы (словари), так как в качестве индексов могут выступать не только числа, но и строковые ключи. Ресурсы — это специальные ссылки на внешние по отношению к скрипту сущности, такие как открытые файлы, соединения с базами данных или потоки генерации изображений. Существует тенденция к отказу от ресурсно-ориентированного подхода в пользу чисто объектного представления внешних соединений.

В языке присутствуют так называемые псевдотипы (например, mixed, void, self, parent). Псевдотип не является самостоятельным типом данных для хранения значений, а выступает как инструкция проверки типа, указывающая компилятору на допустимость целой группы различных типов.

Важнейшей архитектурной особенностью PHP является наличие суперглобальных массивов. Это встроенные массивы, которые автоматически доступны в любой области видимости программы без использования специальных директив. К ним относятся:

  • $GLOBALS — массив всех глобальных переменных программы.
  • $_SERVER — параметры и переменные, передаваемые сервером и операционной системой.
  • $_GET и $_POST — массивы параметров, извлеченных из URL-запросов и HTML-форм.
  • $_FILES и $_COOKIE — массивы для работы с загружаемыми файлами и пользовательскими сессиями.

Объектно-ориентированное программирование

Поддержка ООП в ранних версиях была слабой, однако начиная с пятой версии язык обладает полноценной объектной моделью. Поддерживаются все ключевые механизмы: инкапсуляция (модификаторы доступа public, protected, private), полиморфизм, финальные и абстрактные методы. Язык не поддерживает классическое множественное наследование классов, но позволяет реализовывать несколько интерфейсов одновременно.

Отдельной категорией в объектной модели PHP выступают «магические методы». Имена таких методов строго начинаются с двух символов подчеркивания. К ним относятся конструкторы (__construct), деструкторы (__destruct), методы перехвата обращений к свойствам (__get) и методы клонирования объектов (__clone). Программист может переопределять магические методы для тонкой настройки поведения объекта в нестандартных ситуациях.

Концептуальный пример объявления класса:

 class Animal {
     private $name;

     public function __construct($animalName) {
         $this->name = $animalName;
     }

     public function getName() {
         return $this->name;
     }
 }
 
 $dog = new Animal("Собака");

Доступ к свойствам и методам объекта осуществляется с помощью специального оператора-стрелки (->). Понятия указателя в классическом виде (как в C или C++) в PHP не существует, хотя объекты передаются в функции по ссылке.

Применение и экосистема

Основное назначение языка — серверная веб-разработка. PHP автоматически извлекает параметры запросов, взаимодействует с формами, HTTP-заголовками, сессиями пользователей и любыми типами баз данных (включая MySQL и Oracle). Язык лежит в основе популярнейших систем управления контентом (CMS) для быстрой разработки сайтов, таких как WordPress, Joomla и Drupal.

Несмотря на узкую серверную специализацию, существует множество расширений для разработки полноценных настольных приложений с графическим интерфейсом. В конце 1990-х и нулевых годах активно развивалась интеграция PHP и среды Delphi (проект Delphi PHP). Были созданы системы быстрой визуальной разработки (RAD) — DevelStudio (впоследствии DevelNext), Dev-PHP. Язык интегрирован с мощными графическими библиотеками через обертки PHP-Qt и WinForms PHP.

Стандартизация и упорядочивание экосистемы контролируется профессиональным сообществом через внедрение стандартных рекомендаций (PSR). Они обеспечивают единый стиль кодирования и совместимость библиотек от различных разработчиков.

Преимущества и критика

К главным преимуществам языка относится его феноменальное распространение в индустрии: язык является основой подавляющего большинства современных сайтов, что обеспечивает стабильный спрос на программистов. Скриптовая природа делает язык простым для изучения и не требующим глубокого знания сложных академических парадигм (например, строгого функционального программирования). Язык постоянно развивается, обладает огромной библиотекой модулей и мощной экосистемой сред разработки (Zend Studio, PHP Designer).

Основная критика языка направлена на проблемы с вычислительной производительностью, отсутствие встроенной поддержки многопоточности и отсутствие поддержки многобайтовых кодировок непосредственно в ядре языка. Однако в большинстве коммерческих проектов эти недостатки нивелируются подключением специализированных C-расширений и использованием кэширующих акселераторов.

См. также

Perl Python

Смотреть видео