PHP - PHP

PHP
PHP-logo.svg
Парадигма Мультипарадигма : императивная , функциональная , объектно-ориентированная , процедурная , рефлексивная.
Разработано Расмус Лердорф
Разработчик Команда разработчиков PHP, Zend Technologies
Впервые появился 8 июня 1995 г . ; 26 лет назад ( 1995-06-08 )
Стабильный выпуск
8.0.11  Отредактируйте это в Викиданных / 23 сентября 2021 г . ; 24 дней назад ( 23 сентября 2021 г. )
Предварительный выпуск
8.1.0 Beta 1/22  Отредактируйте это в Викиданных июля 2021 г . ; 2 месяца назад ( 22 июля 2021 г. )
Печатная дисциплина Динамичный , слабый

начиная с версии 7.0:

Постепенный
Язык реализации C (в первую очередь; некоторые компоненты C ++ )
Операционные системы Unix-подобный , Windows , macOS , IBM i , OpenVMS
Лицензия Лицензия PHP (большая часть движка Zend под лицензией Zend Engine )
Расширения имени файла .php, .phar, .phtml, .pht,.phps
Веб-сайт www .php .net Отредактируйте это в Викиданных
Основные реализации
Zend Engine , HHVM , PeachPie , Quercus , Parrot
Под влиянием
Perl , HTML , C , C ++ , Java , Tcl , JavaScript , Взлом
Под влиянием
Взломать , JSP , ASP

PHP - это язык сценариев общего назначения, предназначенный для веб-разработки . Первоначально он был создан датско-канадским программистом Расмусом Лердорфом в 1994 году. Эталонная реализация PHP теперь производится группой PHP. Изначально PHP означал персональную домашнюю страницу , но теперь это означает рекурсивный инициализм PHP: препроцессор гипертекста .

Код PHP обычно обрабатывается на веб-сервере интерпретатором PHP, реализованным как модуль , демон или исполняемый файл Common Gateway Interface (CGI). На веб-сервере результат интерпретируемого и выполненного кода PHP - который может быть любым типом данных, например, сгенерированным HTML- кодом или данными двоичного изображения - будет формировать весь или часть HTTP- ответа. Существуют различные системы веб-шаблонов, системы управления веб- контентом и веб-структуры, которые можно использовать для координации или облегчения генерации этого ответа. Кроме того, PHP можно использовать для многих задач программирования вне веб-контекста, таких как автономные графические приложения и управление роботизированными дронами . Код PHP также может быть выполнен непосредственно из командной строки .

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

Язык PHP развивался без письменной формальной спецификации или стандарта до 2014 года, при этом исходная реализация действовала как стандарт де-факто, которому другие реализации стремились следовать. С 2014 года продолжалась работа по созданию формальной спецификации PHP.

W3Techs сообщает, что по состоянию на апрель 2021 года «PHP используется 79,2% всех веб-сайтов, чей серверный язык программирования нам известен».

История

История ранних веков

Расмус Лердорф , который написал исходный компонент Common Gateway Interface (CGI), вместе с Энди Гутмансом и Зивом Сураски , которые переписали синтаксический анализатор , сформировавший PHP 3.

Разработка PHP началась в 1994 году, когда Расмус Лердорф написал несколько программ Common Gateway Interface (CGI) на C , которые он использовал для поддержки своей личной домашней страницы . Он расширил их для работы с веб-формами и для связи с базами данных и назвал эту реализацию «Personal Home Page / Forms Interpreter» или PHP / FI.

PHP / FI можно использовать для создания простых динамических веб-приложений . Чтобы ускорить создание отчетов об ошибках и улучшить код, Лердорф первоначально объявил о выпуске PHP / FI как «Инструменты персональной домашней страницы (PHP Tools) версии 1.0» в группе обсуждения Usenet comp.infosystems.www.authoring.cgi 8 июня 1995 г. В этом выпуске уже были основные функциональные возможности PHP. Это включало Perl-подобные переменные , обработку форм и возможность встраивать HTML . Синтаксис напоминал Perl , но был более простым, более ограниченным и менее последовательны.

Пример раннего синтаксиса PHP :

<!--include /text/header.html-->

<!--getenv HTTP_USER_AGENT-->
<!--if substr $exec_result Mozilla-->
  Hey, you are using Netscape!<p>
<!--endif-->

<!--sql database select * from table where user='$username'-->
<!--ifless $numentries 1-->
  Sorry, that record does not exist<p>
<!--endif exit-->
  Welcome <!--$user-->!<p>
  You have <!--$index:0--> credits left in your account.<p>

<!--include /text/footer.html-->

Ранний PHP не задумывался как новый язык программирования и рос органически, и Лердорф, оглядываясь назад, заметил: «Я не знаю, как это остановить, никогда не было никакого намерения написать язык программирования [...] У меня есть абсолютно не представляю, как написать язык программирования, я просто продолжал добавлять следующий логический шаг на этом пути ». Команда разработчиков начала формироваться и после нескольких месяцев работы и бета- тестирования официально выпустила PHP / FI 2 в ноябре 1997 года.

Тот факт, что PHP изначально не разрабатывался, а разрабатывался органически, привел к непоследовательному именованию функций и непоследовательному порядку их параметров. В некоторых случаях имена функций выбирались так, чтобы соответствовать библиотекам нижнего уровня, которые PHP «обертывал», в то время как в некоторых очень ранних версиях PHP длина имен функций использовалась внутри как хэш-функция , поэтому имена были выбраны так, чтобы улучшить распределение хеш-значений .

PHP 3 и 4

Это пример настраиваемого кода PHP для системы управления контентом WordPress .

Зеев Сураски и Энди Гутманс переписали синтаксический анализатор в 1997 году и легли в основу PHP 3, изменив имя языка на рекурсивную аббревиатуру PHP: Hypertext Preprocessor . После этого началось публичное тестирование PHP 3, и официальный запуск состоялся в июне 1998 года. Сураски и Гутманс затем начали новую перезапись ядра PHP, выпустив Zend Engine в 1999 году. Они также основали Zend Technologies в Рамат-Гане , Израиль .

22 мая 2000 года был выпущен PHP 4 на базе Zend Engine 1.0. К августу 2008 года эта ветка достигла версии 4.4.9. PHP 4 в настоящее время больше не находится в разработке, и не планируется выпуск каких-либо обновлений безопасности.

PHP 5

1 июля 2004 года был выпущен PHP 5 на базе нового Zend Engine II. PHP 5 включает новые функции, такие как улучшенная поддержка объектно-ориентированного программирования , расширение PHP Data Objects (PDO) (которое определяет легкий и согласованный интерфейс для доступа к базам данных) и многочисленные улучшения производительности. В 2008 году PHP 5 стал единственной стабильной версией, находящейся в стадии разработки. Поздняя статическая привязка отсутствовала в предыдущих версиях PHP и была добавлена ​​в версии 5.3.

Многие известные проекты с открытым исходным кодом перестали поддерживать PHP 4 в новом коде с 5 февраля 2008 года из-за инициативы GoPHP5, предоставленной консорциумом разработчиков PHP, продвигающих переход с PHP 4 на PHP 5.

Со временем интерпретаторы PHP стали доступны в большинстве существующих 32-разрядных и 64-разрядных операционных систем, либо путем сборки их из исходного кода PHP, либо с помощью предварительно созданных двоичных файлов. Для версий PHP 5.3 и 5.4 единственными доступными двоичными дистрибутивами Microsoft Windows были 32-битные сборки IA-32 , требующие 32-битного режима совместимости Windows при использовании Internet Information Services (IIS) на 64-битной платформе Windows. Версия PHP 5.5 сделала 64-битные сборки x86-64 доступными для Microsoft Windows.

Официальная поддержка безопасности PHP 5.6 закончилась 31 декабря 2018 года.

PHP 6 и Юникод

PHP получил неоднозначные отзывы из-за отсутствия поддержки Unicode на уровне ядра языка. В 2005 году был инициирован проект, возглавляемый Андреем Змиевским, по внедрению встроенной поддержки Unicode в PHP путем встраивания библиотеки International Components for Unicode (ICU) и внутреннего представления текстовых строк в формате UTF-16 . Поскольку это приведет к серьезным изменениям как во внутреннем устройстве языка, так и в пользовательском коде, планировалось выпустить его как версию 6.0 языка вместе с другими основными функциями, находившимися на тот момент в разработке.

Однако нехватка разработчиков, которые понимали необходимые изменения, и проблемы с производительностью, возникающие при преобразовании в UTF-16 и из UTF-16, который редко используется в веб-контексте, привели к задержкам в реализации проекта. В результате в 2009 году был создан выпуск PHP 5.3, в котором многие функции, не относящиеся к Unicode, были перенесены из PHP 6, особенно пространства имен. В марте 2010 года проект в его нынешнем виде был официально закрыт, и был подготовлен выпуск PHP 5.4, содержащий большинство оставшихся не-Unicode функций из PHP 6, таких как трейты и повторное связывание замыкания. Первоначальные надежды заключались в том, что будет сформирован новый план интеграции Unicode, но к 2014 году так и не был принят.

PHP 7

В 2014 и 2015 годах была разработана новая основная версия PHP - PHP 7. Нумерация этой версии вызвала некоторые споры среди внутренних разработчиков. Хотя эксперимент PHP 6 Unicode так и не был выпущен, в нескольких статьях и названиях книг упоминалось имя PHP 6, что могло вызвать путаницу, если бы в новом выпуске было повторное использование этого имени. После голосования было выбрано название PHP 7.

В основе PHP 7 лежит ветвь PHP, которая изначально называлась PHP следующего поколения ( phpng ). Он был создан Дмитрием Стоговым, Ксинчен Хуи и Никитой Поповым и был направлен на оптимизацию производительности PHP за счет рефакторинга Zend Engine при сохранении почти полной языковой совместимости. К 14 июля 2014 года тесты на базе WordPress , которые служили основным набором тестов для проекта phpng, показали почти 100% рост производительности. Изменения от phpng сделать его проще для повышения производительности в версиях будущих, как более компактные структуры данных и другие изменения рассматриваются как лучше подходят для успешного перехода к точно в срок (JIT) компилятор. Из-за значительных изменений переработанный Zend Engine получил название Zend Engine 3 , заменив Zend Engine 2, использовавшийся в PHP 5.

Из-за значительных внутренних изменений в phpng он должен получить новый основной номер версии PHP, а не второстепенный выпуск PHP 5, в соответствии с процессом выпуска PHP. В основных версиях PHP разрешено нарушать обратную совместимость кода, и поэтому PHP 7 предоставил возможность для других улучшений, помимо phpng, которые требуют разрывов обратной совместимости. В частности, в него были внесены следующие изменения:

  • Многие устаревшие механизмы ошибок PHP фатального или исправимого уровня были заменены современными объектно-ориентированными исключениями .
  • Синтаксис переменного разыменования был переработан , чтобы быть внутренне последовательными и полным, что позволяет использовать операторы ->, [], (), {}, и ::, с произвольными содержательными левосторонними выражениями.
  • Поддержка устаревших методов конструктора в стиле PHP 4 устарела.
  • Поведение foreachзаявления было изменено на более предсказуемое.
  • Конструкторы для нескольких классов, встроенных в PHP, которые возвращали null при сбое, были изменены, чтобы вместо этого генерировать исключение для согласованности.
  • Несколько необслуживаемых или устаревших интерфейсов программирования серверных приложений (SAPI) и расширений были удалены из ядра PHP, в первую очередь устаревшее mysqlрасширение.
  • Поведение list()оператора было изменено, чтобы удалить поддержку строк.
  • Была удалена поддержка устаревших разделителей в стиле ASP <%и %>и <script language="php"> ... </script>.
  • Исправлена недоработка, позволяющая оператору switch иметь несколько defaultпредложений.
  • Поддержка шестнадцатеричных чисел в некоторых неявных преобразованиях из строк в числовые типы была удалена.
  • Операторы сдвига влево и вправо были изменены, чтобы вести себя более согласованно на разных платформах.
  • Преобразования между числами с плавающей запятой и целыми числами были изменены (например, бесконечность изменена на преобразование в ноль) и реализованы более последовательно на разных платформах.

PHP 7 также включает новые языковые функции. В частности, он представил объявления типа возвращаемого значения для функций, которые дополняют существующие объявления типа параметра, и поддержку скалярных типов (целое число, число с плавающей запятой, строка и логическое значение) в объявлениях параметров и возвращаемых типов.

PHP 8

PHP 8 был выпущен 26 ноября 2020 года. PHP 8 является основной версией и имеет существенные изменения по сравнению с предыдущими версиями. Новые функции и заметные изменения включают:

Своевременная компиляция

Компиляция точно в срок поддерживается в PHP 8.

JIT-компилятор PHP 8 может обеспечить существенное улучшение производительности в некоторых случаях использования. Разработчик PHP Никита Попов заявил, что улучшение производительности для большинства веб-сайтов будет менее значительным, чем при обновлении с PHP 5 до PHP 7. Ожидается, что повышение производительности за счет добавления JIT-компилятора будет более значительным для операций математического типа, чем для распространенные варианты использования веб-разработки. Кроме того, JIT-компилятор обеспечивает в будущем возможность переноса некоторого кода с C на PHP из-за улучшения производительности для некоторых случаев использования.

Добавление выражения соответствия

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

Изменения и дополнения типов

PHP 8 представил типы объединения, новый staticтип возвращаемого значения и новый mixedтип.

«Атрибуты», часто называемые «аннотациями» в других языках программирования, были добавлены в PHP 8, что позволяет добавлять метаданные в классы.

throwбыл изменен с утверждения на выражение. Это позволяет создавать исключения в местах, которые ранее были невозможны.

Изменения и дополнения синтаксиса

PHP 8 включает изменения, позволяющие использовать альтернативный, более сжатый или более согласованный синтаксис в ряде сценариев. Например, оператор nullsafe похож на оператор объединения null?? , но используется при вызове методов. Следующий фрагмент кода не выдаст ошибку, если getBirthday()вернет значение null:

$human_readable_date = $user->getBirthday()?->diffForHumans();

Расширение свойств конструктора было добавлено в качестве « синтаксического сахара », позволяющего автоматически устанавливать свойства класса при передаче параметров в конструктор класса . Это сокращает объем написанного стандартного кода .

Другие незначительные изменения включают поддержку использования ::classна объектах, которые служат альтернативой использованию get_class(); не захватывающие уловы в блоках try-catch; корректировки синтаксиса переменных для устранения несоответствий; поддержка именованных аргументов; и поддержка замыкающих запятых в списках параметров, что добавляет единообразия с поддержкой замыкающих запятых в других контекстах, например в массивах.

Изменения и дополнения в стандартной библиотеке

  • Слабые карты были добавлены в PHP 8. A WeakMapсодержит ссылки на объекты, но эти ссылки не препятствуют сборке мусора для таких объектов . Это может обеспечить повышение производительности в сценариях, в которых данные кэшируются ; это особенно актуально для ORM .
  • Различные настройки интерфейсов, такие как добавление поддержки для создания DateTimeобъектов из интерфейсов и добавление Stringableинтерфейса, который можно использовать для подсказки типов.
  • Различные новые функции, включая str_contains (), str_starts_with () и str_ends_with (); fdiv (); get_debug_type (); и get_resource_id ()
  • Объектная реализация token_get_all ()

Дополнительные изменения

  • Аннотации типов также были добавлены в исходный код PHP на C, чтобы внутренние функции и методы могли иметь «полную информацию о типе в отражении».
  • Наследование частными методами
  • Абстрактные методы в улучшении характеристик

История выпуска

Версия Дата выхода Поддерживается до Примечания
Старая версия, больше не поддерживается: 1.0 8 июня 1995 г. Официально называется «Инструменты персональной домашней страницы (инструменты PHP)». Это первое использование имени «PHP».
Старая версия, больше не поддерживается: 2.0 1 ноября 1997 г. Официально называется «PHP / FI 2.0». Это первый выпуск, который на самом деле можно охарактеризовать как PHP, поскольку он является автономным языком с множеством функций, которые сохранились до наших дней.
Старая версия, больше не поддерживается: 3.0 6 июня 1998 г. 20 октября 2000 г. Разработка переходит от одного человека к нескольким разработчикам. Зеев Сураски и Энди Гутманс переписывают базу для этой версии.
Старая версия, больше не поддерживается: 4.0 22 мая 2000 г. 23 июня 2001 г. Добавлена ​​более продвинутая двухэтапная система синтаксического анализа / выполнения тегов, называемая движком Zend.
Старая версия, больше не поддерживается: 4.1 10 декабря 2001 г. 12 марта 2002 г. Введенные "Суперглобальные" ( $_GET, $_POST, $_SESSIONи т.д.)
Старая версия, больше не поддерживается: 4.2 22 апреля 2002 г. 6 сентября 2002 г. register_globalsПо умолчанию отключено . Данные, полученные по сети, больше не вставляются напрямую в глобальное пространство имен, закрывая возможные дыры в безопасности в приложениях.
Старая версия, больше не поддерживается: 4.3 27 декабря 2002 г. 31 марта 2005 г. Добавлен интерфейс командной строки (CLI) в дополнение к CGI.
Старая версия, больше не поддерживается: 4.4 11 июля 2005 г. 7 августа 2008 г. Исправлена ​​ошибка повреждения памяти, которая требовала нарушения бинарной совместимости с расширениями, скомпилированными для PHP версии 4.3.x.
Старая версия, больше не поддерживается: 5.0 13 июля 2004 г. 5 сентября 2005 г. Zend Engine II с новой объектной моделью.
Старая версия, больше не поддерживается: 5.1 24 ноября 2005 г. 24 августа 2006 г. Улучшения производительности с введением переменных компилятора в переработанный PHP Engine. Добавлены объекты данных PHP (PDO) в качестве согласованного интерфейса для доступа к базам данных.
Старая версия, больше не поддерживается: 5.2 2 ноября 2006 г. 6 января 2011 г. Расширение фильтра включено по умолчанию. Встроенная поддержка JSON .
Старая версия, больше не поддерживается: 5,3 30 июня 2009 г. 14 августа 2014 г. Поддержка пространства имен ; позднее статическое связывание , прыгать метка (ограниченное Гото ), анонимные функции , замыкания , PHP архивы (Phar), вывоз мусора для циклических ссылок, улучшенная Windows , поддержка, sqlite3, mysqlnd в качестве замены для libmysql как основной библиотеки для расширений , которые работают с MySQL , fileinfo в качестве замены mime_magic для лучшей поддержки MIME , расширения интернационализации и прекращения поддержки расширения ereg.
Старая версия, больше не поддерживается: 5,4 1 марта 2012 г. 3 сентября 2015 г. Поддержка трейтов, поддержка синтаксиса коротких массивов. Убраны пункты: register_globals, safe_mode, allow_call_time_pass_reference, , и . Встроенный веб-сервер. Несколько улучшений существующих функций, производительности и уменьшения требований к памяти. session_register()session_unregister()session_is_registered()
Старая версия, больше не поддерживается: 5.5 20 июня 2013 г. 10 июля 2016 г. Поддержка генераторов , finallyблоков обработки исключений, OpCache (на основе Zend Optimizer +) в официальном дистрибутиве.
Старая версия, больше не поддерживается: 5,6 28 августа 2014 г. 31 декабря 2018 г. Постоянные скалярные выражения, вариативные функции , распаковка аргументов, новый оператор возведения в степень, расширения useоператора для функций и констант, новый phpdbgотладчик в виде модуля SAPI и другие небольшие улучшения.
6.x Не выпущен N / A Заброшенная версия PHP, в которой планировалось включить встроенную поддержку Unicode.
Старая версия, больше не поддерживается: 7.0 3 декабря 2015 г. 10 января 2019 г. Zend Engine 3 (повышение производительности и поддержка 64-битных целых чисел в Windows), унифицированный синтаксис переменных, процесс компиляции на основе AST , добавлено , согласованность побитового сдвига между платформами, оператор ( объединение с нулевым значением ), синтаксис escape- кода Unicode , объявления возвращаемого типа, объявления скалярных типов (целые числа, числа с плавающей запятой, строковые и логические), трехсторонний оператор сравнения "космический корабль" , делегирование генератора , анонимные классы , более простой и более доступный API CSPRNG , замена многих оставшихся внутренних "ошибок" PHP на более современные исключения , и сокращенный синтаксис для импорта нескольких элементов из пространства имен. Closure::call()??<=>
Старая версия, больше не поддерживается: 7.1 1 декабря 2016 г. 1 декабря 2019 г. тип возвращаемого значения void , модификаторы видимости констант класса
Старая версия, больше не поддерживается: 7.2 30 ноября 2017 г. 30 ноября 2020 г. Объявление параметра объекта и типа возвращаемого значения, расширение Libsodium, переопределение абстрактного метода, расширение типа параметра
Старая версия, но все еще поддерживается: 7.3 6 декабря 2018 г. 6 декабря 2021 г. Гибкая Heredoc и синтаксис Nowdoc, поддержка эталонного назначения и массива деконструкции со списком (), поддержка PCRE2, функция hrtime ()
Старая версия, но все еще поддерживается: 7,4 28 ноября 2019 г. 28 ноября 2022 г. Типизированные свойства 2.0, предварительная загрузка, оператор присваивания с объединением нуля, улучшение openssl_random_pseudo_bytes, слабые ссылки, FFI - интерфейс внешней функции , всегда доступное расширение хэша, реестр хешей паролей, разделение многобайтовых строк, отражение для ссылок, разделение ext / wddx, новая сериализация настраиваемых объектов механизм
Текущая стабильная версия: 8.0 26 ноября 2020 г. 26 ноября 2023 г. Компиляция Just-In-Time (JIT) , массивы, начинающиеся с отрицательного индекса, более строгая / разумная семантика языка (проверка для абстрактных методов признаков), более разумное сравнение строк с числами, более разумные числовые строки, ошибка TypeError при недопустимых арифметических / побитовых операторах, переклассификация различные ошибки механизма, ошибки согласованного типа для внутренних функций, фатальная ошибка для несовместимых сигнатур методов), независимое от локали преобразование с плавающей точкой в ​​строку, настройки синтаксиса переменных, атрибуты, именованные аргументы, выражение соответствия, продвижение свойства конструктора, типы объединения, смешанный тип, статический тип возвращаемого значения, нулевой безопасный оператор, не захватывающие уловки, выражение выброса, расширение JSON всегда доступно.
Будущий выпуск: 8.1 25 ноября 2021 г. ?? Ноябрь 2024 г. Явная восьмеричная целочисленная буквальная запись, перечисления
Легенда:
Старая версия
Старая версия, все еще поддерживается
Последняя версия
Последняя предварительная версия
Будущий выпуск

Начиная с 28 июня 2011 года, команда разработчиков PHP реализовала график выпуска новых версий PHP. Согласно этой системе, по крайней мере, один выпуск должен происходить каждый месяц. Раз в год должен выпускаться небольшой выпуск, который может включать новые функции. Каждый второстепенный выпуск должен поддерживаться как минимум в течение двух лет с исправлениями безопасности и ошибок, а затем как минимум один год только исправлениями безопасности, в общей сложности трехлетний процесс выпуска для каждого второстепенного выпуска. Никакие новые функции, за исключением небольших и автономных, не должны вводиться в второстепенный выпуск в течение трехлетнего процесса выпуска.

Талисман

ElePHPant, талисман PHP

Талисманом PHP проекта является elePHPant , синий слон с логотипом PHP на его стороне, разработанный Винсентом Понтиер в 1998 году «The (PHP) письма образуя форму слона , если смотреть в боковом углу.» ElePHPant иногда бывает разного цвета в форме плюшевой игрушки .

За прошедшие годы было создано множество вариаций этого талисмана. Только elePHPants, основанные на оригинальном дизайне Винсента Понтье, считаются официальными в сообществе. Это коллекционные предметы, и некоторые из них встречаются крайне редко.

Синтаксис

Приложение "Hello World" в PHP 7.4, работающее на сервере разработки localhost

Следующее "Hello, World!" Программа написана на PHP-коде, встроенном в HTML- документ:

<!DOCTYPE html>
<html>
    <head>
        <title>PHP "Hello, World!" program</title>
    </head>
    <body>
        <?php
            echo '<p>Hello, World!</p>';
        ?>
    </body>
</html>

Однако, поскольку нет требований для встраивания кода PHP в HTML, простейшая версия Hello, World! может быть записан так, с опущением закрывающего тега, как предпочтительнее, в файлах, содержащих чистый PHP-код. ?>

<?php
    echo 'Hello, World!';
?>

Интерпретатор PHP выполняет код PHP только в пределах его разделителей . Все, что находится за пределами его разделителей, не обрабатывается PHP, хотя текст, отличный от PHP, по-прежнему подчиняется структурам управления, описанным в коде PHP. Наиболее распространенные разделители - <?phpоткрывать и закрывать разделы PHP. Сокращенная форма тоже существует. Этот короткий разделитель делает файлы сценариев менее переносимыми, поскольку их поддержка может быть отключена в локальной конфигурации PHP, и поэтому это не рекомендуется. И наоборот, нет никаких рекомендаций относительно короткого тега echo . До PHP 5.4.0 этот короткий синтаксис для работал только с включенным параметром конфигурации, в то время как для PHP 5.4.0 и более поздних версий он был доступен всегда. Назначение всех этих разделителей - отделить код PHP от содержимого, не относящегося к PHP, такого как код JavaScript или разметка HTML. Так что самое короткое "Hello, World!" программа, написанная на PHP: ?><?<?=echoshort_open_tag

<?='Hello, World!';

Первая форма разделителей <?phpи в XHTML и других документах XML создает правильно сформированные инструкции обработки XML. Это означает, что полученная смесь кода PHP и другой разметки в файле на стороне сервера сама по себе является правильно сформированным XML. ?>

Переменные имеют префикс в виде символа доллара , и тип не нужно указывать заранее. PHP 5 представил объявления типов, которые позволяют функциям заставлять свои параметры быть объектами определенного класса, массивами, интерфейсами или функциями обратного вызова . Однако до PHP 7 объявления типов нельзя было использовать со скалярными типами, такими как целые или строковые.

Ниже приведен пример объявления и инициализации переменных PHP.

<?php
    $name = 'John';  // variable of string type being declared and Initialized
    $age = 18;       // variable of integer type being declared and Initialized
    $height = 5.3;   // variable of double type being declared and Initialized
    echo $name . ' is ' . $height . 'm tall\n'; // concatenating variables and strings
    echo "$name is $age years old."; // interpolating variables to string
?>

В отличие от имен функций и классов, имена переменных чувствительны к регистру. И строки в двойных кавычках (""), и строки heredoc предоставляют возможность интерполировать значение переменной в строку. PHP обрабатывает символы новой строки как пробелы в манере языка произвольной формы , а операторы заканчиваются точкой с запятой. PHP имеет три типа синтаксиса комментариев : /* */помечает блок и встроенные комментарии; //или #используются для однострочных комментариев. Этот echoоператор является одним из нескольких средств, которые PHP предоставляет для вывода текста.

С точки зрения ключевых слов и синтаксиса языка PHP похож на синтаксис стиля C. ifусловия, forи whileпетли, и функция возвращает похожи на синтаксиса языков , таких как C, C ++, C #, Java и Perl.

Типы данных

PHP слабо типизирован . Она хранит целые числа от платформы зависит диапазоне, либо как 32, 64 или 128 бит подписанным целым числом эквивалентно С-языка длинного типа . Целые числа без знака в определенных ситуациях преобразуются в значения со знаком, что отличается от поведения многих других языков программирования. Целочисленные переменные могут быть присвоены с использованием десятичной (положительной и отрицательной), восьмеричной , шестнадцатеричной и двоичной нотации.

Числа с плавающей запятой также хранятся в диапазоне, зависящем от платформы. Они могут быть указаны с использованием нотации с плавающей запятой или двух форм экспоненциальной нотации . PHP имеет собственный логический тип, который похож на собственные логические типы в Java и C ++ . При использовании правил преобразования логического типа ненулевые значения интерпретируются как истинные, а нулевые как ложные, как в Perl и C ++.

Тип данных NULL представляет переменную, не имеющую значения; NULL- единственное допустимое значение для этого типа данных.

Переменные типа «ресурс» представляют собой ссылки на ресурсы из внешних источников. Обычно они создаются функциями из определенного расширения и могут обрабатываться только функциями из того же расширения; Примеры включают файлы, изображения и ресурсы базы данных.

Массивы могут содержать элементы любого типа, который может обрабатывать PHP, включая ресурсы, объекты и даже другие массивы. Порядок сохраняется в списках значений и в хэшах с ключами и значениями, и они могут смешиваться. PHP также поддерживает строки , которые можно использовать с одинарными кавычками, двойными кавычками, синтаксисом nowdoc или heredoc .

Standard PHP Library (SPL) пытается решить стандартные проблемы и реализует эффективные интерфейсы доступа к данным и классы.

Функции

PHP определяет большой набор функций на основном языке, и многие из них также доступны в различных расширениях; эти функции хорошо документированы в онлайн- документации PHP . Однако встроенная библиотека имеет широкий спектр соглашений об именах и связанных с ними несоответствий, как описано выше в разделе « История» .

Пользовательские функции могут быть определены разработчиком:

function myAge(int $birthYear): string
{
    // calculate the age by subtracting the birth year from the current year.
    $yearsOld = date('Y') - $birthYear;

    // return the age in a descriptive string.
    return $yearsOld . ' year' . ($yearsOld != 1 ? 's':'');
}

echo 'I am currently ' . myAge(1995) . ' old.';

В 2021 году результатом приведенной выше примерной программы будет «Сейчас мне 26 лет».

Вместо указателей функций на функции в PHP можно ссылаться с помощью строки, содержащей их имена. Таким образом, обычные функции PHP могут использоваться, например, как обратные вызовы или в таблицах функций . Пользовательские функции могут быть созданы в любое время без прототипирования . Функции могут быть определены внутри блоков кода, что позволяет во время выполнения принимать решение о том, следует ли определять функцию. Есть function_existsфункция, которая определяет, была ли уже определена функция с данным именем. Вызов функций должен использовать круглые скобки, за исключением функций конструктора классов с нулевым аргументом, вызываемых с помощью оператора PHP new, и в этом случае круглые скобки необязательны.

До PHP 5.3 в PHP не существовало поддержки анонимных функций и закрытий . Хотя create_function()он существует с PHP 4.0.1, это просто тонкая оболочка eval(), позволяющая создавать обычные функции PHP во время выполнения программы. В PHP 5.3 добавлен синтаксис для определения анонимной функции или « закрытия », которая может захватывать переменные из окружающей области. В PHP 7.4 был добавлен сокращенный синтаксис стрелок:

function getAdder($x) {
    return fn($y) => $x + $y;
}

$adder = getAdder(8);
echo $adder(2); // prints "10"

В приведенном выше примере getAdder()функция создает замыкание, используя переданный аргумент $x(ключевое слово useимпортирует переменную из лексического контекста), которая принимает дополнительный аргумент $yи возвращает созданное замыкание вызывающей стороне. Такая функция является объектом первого класса, что означает, что ее можно сохранить в переменной, передать в качестве параметра другим функциям и т. Д.

В отличие от языка с динамической типизацией, PHP поддерживает объявления типов для параметров функций, которые применяются во время выполнения. Это поддерживается для классов и интерфейсов с PHP 5.0, для массивов с PHP 5.1, для "вызываемых" с PHP 5.4 и скалярных (целочисленных, с плавающей запятой, строковых и логических) типов с PHP 7.0. В PHP 7.0 также есть объявления типов для типов, возвращаемых функцией, которые выражаются помещением имени типа после списка параметров, которому предшествует двоеточие. Например, getAdderфункция из предыдущего примера может быть аннотирована такими типами, как в PHP 7:

function getAdder(int $x): Closure
{
    return fn(int $y): int => $x + $y;
}

$adder = getAdder(8);
echo $adder(2); // prints "10"
echo $adder(null); // throws an exception because an incorrect type was passed
$adder = getAdder([]); // would also throw an exception

По умолчанию объявления скалярных типов следуют принципам слабой типизации. Так, например, если тип параметра - это int, PHP позволит передавать в эту функцию не только целые числа, но также преобразовываемые числовые строки, числа с плавающей запятой или логические значения, и будет преобразовывать их. Однако в PHP 7 есть режим «строгой типизации», который при использовании запрещает такие преобразования для вызовов функций и возвращает их в файл.

Объекты PHP

Базовая функциональность объектно-ориентированного программирования была добавлена ​​в PHP 3 и улучшена в PHP 4. Это позволило PHP получить дополнительную абстракцию, облегчая творческие задачи для программистов, использующих этот язык. Обработка объектов была полностью переписана для PHP 5, расширен набор функций и улучшена производительность. В предыдущих версиях PHP объекты обрабатывались как типы значений . Недостатком этого метода было то, что код должен был интенсивно использовать «ссылочные» переменные PHP, если он хотел изменить переданный объект, а не создавать его копию. В новом подходе на объекты ссылаются по дескрипторам , а не по значению.

PHP 5 представил частные и защищенные переменные и методы- члены , а также абстрактные классы , конечные классы , абстрактные методы и конечные методы . Он также представил стандартный способ объявления конструкторов и деструкторов , аналогичный способу других объектно-ориентированных языков, таких как C ++ , и стандартную модель обработки исключений . Кроме того, PHP 5 добавил интерфейсы и позволил реализовать несколько интерфейсов. Существуют специальные интерфейсы, которые позволяют объектам взаимодействовать с системой времени выполнения. Объекты, реализующие ArrayAccess, могут использоваться с синтаксисом массива, а объекты, реализующие Iterator или IteratorAggregate, могут использоваться с foreach конструкцией языка . В движке нет функции виртуальной таблицы , поэтому статические переменные связываются с именем вместо ссылки во время компиляции.

Если разработчик создает копию объекта, используя зарезервированное слово clone, движок Zend проверит, определен ли __clone()метод. В противном случае он вызовет значение по умолчанию, __clone()которое скопирует свойства объекта. Если __clone()метод определен, то он будет отвечать за установку необходимых свойств в созданном объекте. Для удобства движок предоставит функцию, которая импортирует свойства исходного объекта, поэтому программист может начать с реплики исходного объекта по значению и переопределить только те свойства, которые необходимо изменить.

Видимость в PHP свойств и методов определяются с использованием ключевых слов public , privateи protected. По умолчанию публично, если используется только var ; varявляется синонимом public. Заявленные предметы publicдоступны везде. protectedограничивает доступ к унаследованным классам (и к классу, определяющему элемент). privateограничивает видимость только классом, определяющим элемент. Объекты одного типа имеют доступ к закрытым и защищенным членам друг друга, даже если они не являются одним и тем же экземпляром.

Пример

Ниже приведен базовый пример объектно-ориентированного программирования в PHP 8:

<?php

abstract class User
{
    protected string $name;

    public function __construct(string $name)
    {
        // make first letter uppercase and the rest lowercase
        $this->name = ucfirst(strtolower($name));
    }

    public function greet(): string
    {
        return "Hello, my name is " . $this->name;
    }

    abstract public function job(): string;
}

class Student extends User
{
    public function __construct(string $name, private string $course)
    {
        parent::__construct($name);
    }

    public function job(): string
    {
        return "I learn " . $this->course;
    }
}

class Teacher extends User
{
    public function __construct(string $name, private array $teachingCourses)
    {
        parent::__construct($name);
    }

    public function job(): string
    {
        return "I teach " . implode(", ", $this->teachingCourses);
    }
}

$students = [
    new Student("Alice", "Computer Science"),
    new Student("BOB", "Computer Science"),
    new Student("Charlie", "Business Studies"),
];

$teachers = [
    new Teacher("Dan", ["Computer Science", "Information Security"]),
    new Teacher("Erin", ["Computer Science", "3D Graphics Programming"]),
    new Teacher("Frankie", ["Online Marketing", "Business Studies", "E-commerce"]),
];

foreach ([$students, $teachers] as $users) {
    echo $users[0]::class . "s:\n";

    array_walk($users, function (User $user) {
        echo "{$user->greet()}, {$user->job()}\n";
    });
}

// Output of program:
// Students:
// Hello, my name is Alice, I learn Computer Science
// Hello, my name is Bob, I learn Computer Science
// Hello, my name is Charlie, I learn Business Studies
// Teachers:
// Hello, my name is Dan, I teach Computer Science, Information Security
// Hello, my name is Erin, I teach Computer Science, 3D Graphics Programming
// Hello, my name is Frankie, I teach Online Marketing, Business Studies, E-commerce

Реализации

Единственная полная реализация PHP - это оригинал, известный просто как PHP. Он наиболее широко используется и работает на движке Zend Engine . Чтобы отличить его от других реализаций, его иногда неофициально называют «Zend PHP». Zend Engine компилирует исходный код PHP на лету во внутренний формат, который он может выполнять, поэтому он работает как интерпретатор . Это также «эталонная реализация» PHP, поскольку PHP не имеет формальной спецификации, и поэтому семантика Zend PHP определяет семантику PHP. Из-за сложной и тонкой семантики PHP, определяемой тем, как работает Zend, конкурирующим реализациям трудно обеспечить полную совместимость.

Модель PHP «один запрос на выполнение сценария» и тот факт, что Zend Engine является интерпретатором, приводят к неэффективности; в результате были разработаны различные продукты, помогающие повысить производительность PHP. Чтобы ускорить время выполнения и не компилировать исходный код PHP каждый раз при доступе к веб-странице, сценарии PHP также могут быть развернуты во внутреннем формате механизма PHP с использованием кеша кодов операций , который работает путем кэширования скомпилированной формы сценарий PHP (коды операций) в общей памяти, чтобы избежать накладных расходов на синтаксический анализ и компиляцию кода при каждом запуске сценария. Кэш опкодов Zend Opcache встроен в PHP, начиная с версии 5.5. Другим примером широко используемого кэша кодов операций является альтернативный кэш PHP (APC), который доступен как расширение PECL .

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

  • HHVM (HipHop Virtual Machine) - разработан в Facebook и доступен как открытый исходный код, он преобразует код PHP в байт-код высокого уровня (обычно известный как промежуточный язык ), который затем динамически транслируется в машинный код x86-64 во время выполнения с помощью просто по времени (JIT) компилятор, в результате чего до улучшения 6 × производительности. Однако, начиная с версии 7.2, Zend превзошел HHVM, а HHVM 3.24 - последняя версия, официально поддерживающая PHP.
  • Parrot  - виртуальная машина, предназначенная для эффективного запуска динамических языков; Пипп преобразует исходный код PHP в промежуточное представление Parrot , которое затем транслируется в байт-код Parrot и выполняется виртуальной машиной.
  • PeachPie - компилятор второго поколения для. NET Common Intermediate Language (CIL) байткод, построенный на Рослин платформе; преемник Phalanger, разделяющий несколько архитектурных компонентов
  • Phalanger  - компилирует PHP в байт-код CIL; предшественник PeachPie
  • Quercus  - компилирует PHP в байт-код Java
  • HipHop  - разработанный Facebook и доступный как открытый исходный код, он преобразует сценарии PHP в код C ++, а затем компилирует полученный код, снижая нагрузку на сервер до 50%. В начале 2013 года Facebook осуждается его в пользу HHVM из - за нескольких причин, в том числе трудности развертывания и отсутствие поддержки для всего языка PHP, в том числе create_function()и eval()конструкций.

Лицензирование

PHP - это бесплатное программное обеспечение, выпущенное под лицензией PHP , которая гласит, что:

Продукты, производные от этого программного обеспечения, не могут называться «PHP», а также не может использоваться «PHP» в их названии без предварительного письменного разрешения от group@php.net. Вы можете указать, что ваше программное обеспечение работает совместно с PHP, сказав « Foo for PHP» вместо того, чтобы называть его «PHP Foo» или «phpfoo».

Это ограничение на использование «PHP» делает лицензию PHP несовместимой с Стандартной общественной лицензией (GPL), в то время как лицензия Zend несовместима из-за пункта о рекламе, аналогичного положению в исходной лицензии BSD .

Развитие и сообщество

PHP включает различные бесплатные библиотеки и библиотеки с открытым исходным кодом в свой исходный дистрибутив или использует их в результирующих двоичных сборках PHP. PHP - это, по сути, Интернет- система со встроенными модулями для доступа к серверам протокола передачи файлов (FTP) и многим серверам баз данных, включая PostgreSQL , MySQL , Microsoft SQL Server и SQLite (встроенная база данных), серверы LDAP и другие. . Многочисленные функции, знакомые программистам на C, например, из семейства stdio , доступны в стандартных сборках PHP.

PHP позволяет разработчикам писать расширения на C для добавления функциональности языку PHP. Расширения PHP могут быть скомпилированы в PHP статически или загружены динамически во время выполнения. Были написаны многочисленные расширения для добавления поддержки Windows API , управления процессами в Unix-подобных операционных системах , многобайтовых строк ( Unicode ), cURL и нескольких популярных форматов сжатия . Другие функции PHP, доступные через расширения, включают интеграцию с IRC , динамическое создание изображений и содержимого Adobe Flash , объекты данных PHP (PDO) как уровень абстракции, используемый для доступа к базам данных, и даже синтез речи . Некоторые из основных функций языка, например, работы со строками и массивами, также реализованы как расширения. Проект PHP Extension Community Library (PECL) представляет собой репозиторий расширений для языка PHP.

Некоторые другие проекты, такие как Zephir , предоставляют возможность создания расширений PHP на языке высокого уровня и компиляции в собственные расширения PHP. Такой подход вместо написания расширений PHP непосредственно на C упрощает разработку расширений и сокращает время, необходимое для программирования и тестирования.

К декабрю 2018 года группа PHP состояла из десяти человек: Тиса К. Арнтзена , Стига Баккена , Шейна Каравео , Энди Гутманса , Расмуса Лердорфа , Сэма Руби , Саши Шумана , Зеев Сураски , Джима Уинстеда и Андрея Змиевски .

Zend Technologies предоставляет программистам сертификацию PHP на основе экзамена PHP 7 (а ранее на основе PHP 5.5), чтобы они могли стать сертифицированными разработчиками PHP.

Установка и настройка

Пример вывода функции phpinfo () в PHP 7.1

Существует два основных способа добавления поддержки PHP на веб-сервер - в виде встроенного модуля веб-сервера или в виде исполняемого файла CGI. PHP имеет прямой интерфейс модуля, называемый интерфейсом программирования серверных приложений (SAPI), который поддерживается многими веб-серверами, включая Apache HTTP Server , Microsoft IIS , Netscape (ныне несуществующий) и iPlanet . Некоторые другие веб-серверы, такие как OmniHTTPd, поддерживают интерфейс прикладного программирования Интернет-сервера (ISAPI), который представляет собой интерфейс модуля веб-сервера Microsoft . Если PHP не имеет поддержки модулей для веб-сервера, его всегда можно использовать как общий интерфейс шлюза (CGI) или процессор FastCGI ; в этом случае веб-сервер настроен на использование исполняемого файла PHP CGI для обработки всех запросов к файлам PHP.

PHP-FPM (FastCGI Process Manager) - это альтернативная реализация FastCGI для PHP, входящая в состав официального дистрибутива PHP, начиная с версии 5.3.3. По сравнению со старой реализацией FastCGI он содержит некоторые дополнительные функции, в основном полезные для сильно загруженных веб-серверов.

При использовании PHP для написания сценариев командной строки требуется исполняемый файл интерфейса командной строки (CLI) PHP . PHP поддерживает интерфейс прикладного программирования сервера CLI (SAPI), начиная с PHP 4.3.0. Основное внимание в этом SAPI уделяется разработке приложений оболочки с использованием PHP. Между CLI SAPI и другими SAPI есть довольно много различий, хотя у них действительно много общего.

PHP имеет прямой интерфейс модуля, называемый SAPI, для различных веб-серверов; в случае PHP 5 и Apache 2.0 в Windows он предоставляется в виде файла DLL с именем php5apache2.dll , который является модулем, который, среди других функций, обеспечивает интерфейс между PHP и веб-сервером, реализованный в форме, которая сервер понимает. Эта форма известна как SAPI.

Существуют разные виды SAPI для различных расширений веб-сервера. Например, в дополнение к перечисленным выше, другие SAPI для языка PHP включают общий интерфейс шлюза (CGI) и интерфейс командной строки (CLI).

PHP также можно использовать для написания приложений с графическим пользовательским интерфейсом (GUI) рабочего стола с помощью расширения PHP-GTK . PHP-GTK не входит в официальный дистрибутив PHP и в качестве расширения может использоваться только с версиями PHP 5.1.0 и новее. Наиболее распространенный способ установки PHP-GTK - его компиляция из исходного кода.

Когда PHP установлен и используется в облачных средах, предоставляются комплекты разработки программного обеспечения (SDK) для использования специфичных для облака функций. Например:

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

Использовать

Общий обзор пакета программного обеспечения LAMP, отображаемого здесь вместе с Squid

PHP - это язык сценариев общего назначения, который особенно подходит для серверной веб-разработки , и в этом случае PHP обычно работает на веб-сервере . Любой PHP-код в запрошенном файле выполняется средой выполнения PHP, обычно для создания динамического содержимого веб-страницы или динамических изображений, используемых на веб-сайтах или где-либо еще. Его также можно использовать для написания сценариев из командной строки и приложений с графическим пользовательским интерфейсом (GUI) на стороне клиента . PHP может быть развернут на большинстве веб-серверов, многих операционных систем и платформ , а также может использоваться со многими системами управления реляционными базами данных (RDBMS). Большинство провайдеров веб-хостинга поддерживают PHP для использования их клиентами. Он доступен бесплатно, и PHP Group предоставляет пользователям полный исходный код для создания, настройки и расширения для собственного использования.

Динамическая веб-страница: пример сценариев на стороне сервера (PHP и MySQL)

Первоначально разработанный для создания динамических веб - страниц , PHP в настоящее время сосредоточена в основном на стороне сервера сценариев , и он похож на других языках сценариев на стороне сервера , которые обеспечивают динамическое содержимое с веб - сервера на клиенте , например Microsoft «s ASP.NET , Sun Microsystems " JavaServer Pages , и mod_perl. PHP также привлекал разработку многих программных фреймворков, которые предоставляют строительные блоки и структуру дизайна для содействия быстрой разработке приложений (RAD). Некоторые из них включают PRADO , CakePHP , Symfony , CodeIgniter , Laravel , Yii Framework , Phalcon и Laminas , предлагая функции, аналогичные другим веб-фреймворкам .

Архитектура LAMP стала популярной в веб-индустрии как способ развертывания веб-приложений. PHP обычно используется как P в этом пакете вместе с Linux , Apache и MySQL , хотя P может также относиться к Python , Perl или некоторому их сочетанию. Подобные пакеты, WAMP и MAMP , также доступны для Windows и macOS , где первая буква обозначает соответствующую операционную систему. Хотя и PHP, и Apache предоставляются как часть базовой установки macOS, пользователи этих пакетов ищут более простой механизм установки, который можно легко поддерживать в актуальном состоянии.

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

PHP получил неоднозначные отзывы из-за отсутствия поддержки многопоточности на уровне ядра языка, хотя использование потоков стало возможным благодаря расширению PECL pthreads .

Были созданы интерфейс командной строки, php-cli и два скриптовых движка ActiveX Windows Script Host для PHP.

Статистика популярности и использования

PHP используется для систем управления веб-контентом, включая MediaWiki , WordPress , Joomla , Drupal , Moodle , eZ Publish , eZ Platform и SilverStripe .

Веб-сайты, использующие PHP, включают Facebook , Digg , Dailymotion и Tumblr .

По состоянию на январь 2013 года PHP использовался более чем на 240 миллионах веб-сайтов (39% из отобранных) и был установлен на 2,1 миллиона веб-серверов .

По состоянию на март 2021 года PHP использовался в качестве серверного языка программирования на 79,1% веб-сайтов, по сравнению с 83,5% ранее, когда язык мог быть определен, а PHP 7 является наиболее используемой версией языка с 50,3% всех веб-сайты в сети используют эту версию.

Безопасность

В 2019 году 11% всех уязвимостей, перечисленных в Национальной базе данных уязвимостей, были связаны с PHP; Исторически около 30% всех уязвимостей, перечисленных с 1996 г. в этой базе данных, связаны с PHP. Недостатки технической безопасности самого языка или его основных библиотек встречаются нечасто (22 в 2009 г., около 1% от общего числа, хотя PHP применяется примерно к 20% перечисленных программ). Признавая, что программисты совершают ошибки, некоторые языки включают проверку на заражение, чтобы автоматически обнаруживать отсутствие проверки ввода, что вызывает множество проблем. Такая функция разрабатывается для PHP, но ее включение в релиз несколько раз отклонялось в прошлом.

Есть продвинутые патчи защиты , такие как Suhosin и закаливания -patch, специально разработанные для веб - хостинга среды.

Исторически старые версии PHP имели некоторые параметры конфигурации и значения по умолчанию для таких настроек времени выполнения, что делало некоторые приложения PHP уязвимыми. Среди них magic_quotes_gpcи register_globalsдирективы конфигурации были самыми известными; в последнем случае любые параметры URL стали переменными PHP, открывая путь к серьезным уязвимостям безопасности, позволяя злоумышленнику устанавливать значение любой неинициализированной глобальной переменной и мешать выполнению сценария PHP. Поддержка настроек « волшебных кавычек » и «регистрировать глобальные объекты» устарела, начиная с PHP 5.3.0, и удалена из PHP 5.4.0.

Другой пример потенциальной уязвимости параметров среды выполнения - невозможность отключить выполнение PHP (например, с помощью engineдирективы конфигурации) для каталога, в котором хранятся загруженные файлы; его включение может привести к выполнению вредоносного кода, встроенного в загруженные файлы. Лучше всего либо найти каталог изображений вне корня документа, доступного для веб-сервера, и обслуживать его через промежуточный скрипт, либо отключить выполнение PHP для каталога, в котором хранятся загруженные файлы.

Кроме того, включение динамической загрузки расширений PHP (через enable_dlдирективу конфигурации) в среде общего веб-хостинга может привести к проблемам с безопасностью.

Подразумеваемые преобразования типов , в результате которых разные значения рассматриваются как равные, иногда вопреки намерениям программиста, могут привести к проблемам с безопасностью. Например, результатом сравнения '0e1234' == '0'является то true, что строки, которые можно анализировать как числа, преобразуются в числа; в этом случае первое сравниваемое значение рассматривается как научное представление, имеющее значение (0 × 10 1234 ), что равно нулю. Подобные ошибки привели к уязвимостям аутентификации в Simple Machines Forum , Typo3 и phpBB при сравнении хэшей паролей MD5 . Рекомендуемый способ - использовать hash_equals () (для защиты от атак по времени ) или оператор идентификации ( ), как результат . strcmp==='0e1234' === '0'false

В ходе анализа более 170 000 веб-сайтов в 2013 году , опубликованного Zone-H , наиболее часто (53%) использовавшейся техникой была эксплуатация уязвимости , связанной с включением файлов , в основном связанной с небезопасным использованием языковых конструкций PHP include, requireи allow_url_fopen.

По состоянию на апрель 2021 года W3Techs сообщает, что 64% ​​веб-сайтов, использующих PHP, используют версию 7.2 или более раннюю (которые больше не поддерживаются командой разработчиков PHP), а 35% всех веб-сайтов PHP используют версию 5.6 или более раннюю.

Версию 5 по-прежнему используют 24,5% всех веб-сайтов (сентябрь 2021 г.). Настоятельно рекомендуется перейти на PHP версии 7 или 8 и использовать random_int () вместо rand () или mt_rand (). Есть две атаки, которые могут быть выполнены по источникам энтропии PHP: «Атака семян» и «Атака восстановления состояния». Используя современные технологии графического процессора, злоумышленник может выполнять до 2 ^ 30 вычислений MD5 в секунду с помощью графического процессора стоимостью 250 долларов, а с дополнительными 500 долларами может выполнять до 2 ^ 32 расчетов. В сочетании с « атакой по случаю дня рождения » это может привести к серьезным уязвимостям безопасности.

Смотрите также

использованная литература

дальнейшее чтение

Послушайте эту статью ( 35 минут )
Разговорный значок Википедии
Этот аудиофайл был создан на основе редакции этой статьи от 23 ноября 2011 г. и не отражает последующих правок. ( 2011-11-23 )

внешние ссылки