Парадигма | Мультипарадигмальный : императивный , функциональный , объектно-ориентированный , процедурный , рефлексивный |
---|---|
Разработано | Расмус Лердорф |
Разработчик | Команда разработчиков PHP , Zend Technologies , PHP Foundation |
Впервые появился | 8 июня 1995 г ( 1995-06-08 ) | [1] [2]
Стабильный релиз | 8.3.13 / 24 октября 2024 г. ( 2024-10-24 ) [3] |
Предварительный релиз | 8.4.0 RC 3 / 24 октября 2024 г. ( 2024-10-24 ) [4] |
Дисциплина набора текста | Динамичный , слабый , постепенный [5] |
Язык реализации | C (в основном; некоторые компоненты C++ ) |
ОС | Unix-подобный , Windows , macOS , IBM i , OpenVMS , IBM Z |
Лицензия | Лицензия PHP (большая часть движка Zend по лицензии Zend Engine ) для PHP 4 и более поздних версий (только; двойная лицензия GNU General Public License версии 2 или любой более поздней версии и лицензия PHP для версий PHP 3.0 или более ранних. [6] ) |
Расширения имени файла | .php , .phar , .phtml , .pht ,.phps |
Веб-сайт | www.php.net |
Основные внедрения | |
Zend Engine , HHVM , PeachPie , Quercus , Parrot | |
Под влиянием | |
Perl , C , C++ , Java , [7] Tcl , [2] JavaScript [8] | |
Под влиянием | |
Взломать , JSP , ASP , React JS | |
PHP — это язык сценариев общего назначения, ориентированный на веб-разработку . [9] Первоначально он был создан датско-канадским программистом Расмусом Лердорфом в 1993 году и выпущен в 1995 году. [10] [11] Эталонная реализация PHP в настоящее время производится PHP Group. [12] PHP изначально был аббревиатурой Personal Home Page , [13] [14] но теперь он обозначает рекурсивную аббревиатуру PHP: Hypertext Preprocessor . [15]
PHP-код обычно обрабатывается на веб-сервере интерпретатором PHP, реализованным как модуль , демон или исполняемый файл Common Gateway Interface (CGI). На веб-сервере результат интерпретированного и выполненного PHP-кода, который может быть любым типом данных, например, сгенерированным HTML или двоичными данными изображения, будет формировать весь или часть HTTP- ответа. Существуют различные системы веб-шаблонов , системы управления веб-контентом и веб-фреймворки , которые можно использовать для организации или облегчения генерации этого ответа. Кроме того, PHP можно использовать для многих задач программирования вне веб-контекста, таких как автономные графические приложения [16] и управление дронами . [17] PHP-код также можно напрямую выполнять из командной строки .
Стандартный интерпретатор PHP, работающий на базе Zend Engine , является свободным программным обеспечением , выпущенным по лицензии PHP . PHP широко портирован и может быть развернут на большинстве веб-серверов на различных операционных системах и платформах . [18]
Язык PHP развивался без письменной формальной спецификации или стандарта, при этом исходная реализация выступала в качестве фактического стандарта, которому стремились следовать другие реализации.
W3Techs сообщает, что по состоянию на 27 октября 2024 года [обновлять](примерно через два года после прекращения поддержки PHP 7 и через 11 месяцев после выпуска PHP 8.3) PHP 7 по-прежнему используется на 50,0% веб-сайтов PHP, что является устаревшим и известным как небезопасный. [19] [20] Кроме того, еще более устаревший (прекращенный более 5 лет назад) и небезопасный PHP 5 используется на 13,2%, а более не поддерживаемый PHP 8.0 также очень популярен. Это означает, что подавляющее большинство не использует поддерживаемые версии.
Разработка PHP началась в 1993 году [10] , когда Расмус Лердорф написал несколько программ Common Gateway Interface (CGI) на языке C , [21] [22] , которые он использовал для поддержки своей личной домашней страницы . Он расширил их для работы с веб-формами и для связи с базами данных и назвал эту реализацию «Персональная домашняя страница/Интерпретатор форм» или PHP/FI.
Пример раннего синтаксиса PHP : [23]
<!--include /text/header.html--><!--getenv HTTP_USER_AGENT--> <!--if substr $exec_result Mozilla--> Эй, вы используете Netscape! < p > <!--endif--><!--sql database select * from table where user='$username'--> <!--ifless $numentries 1--> Извините, эта запись не существует < p > <!--endif exit--> Добро пожаловать <!--$user--> ! < p > На вашем счету осталось <!--$index:0--> кредитов. < p ><!--include /text/footer.html-->
PHP/FI можно было использовать для создания простых динамических веб-приложений . Чтобы ускорить отправку сообщений об ошибках и улучшить код, Лердорф изначально анонсировал выпуск PHP/FI как «Personal Home Page Tools (PHP Tools) версии 1.0» в группе обсуждения Usenet comp.infosystems.www.authoring.cgi 8 июня 1995 года. [1] [24] Этот выпуск включал базовые функции, такие как переменные, подобные Perl , обработка форм и возможность встраивания HTML . К этому моменту синтаксис изменился и стал напоминать Perl , но был проще, более ограниченным и менее последовательным. [13] [12]
Ранний PHP никогда не задумывался как новый язык программирования ; скорее, он рос органически, и Лердорф отмечал в ретроспективе: «Я не знаю, как это остановить [...] никогда не было намерения написать язык программирования [...] Я абсолютно не имею представления, как написать язык программирования [...] Я просто продолжал добавлять следующий логический шаг на этом пути». [25] Начала формироваться команда разработчиков, и после месяцев работы и бета -тестирования в ноябре 1997 года был официально выпущен PHP/FI 2. [26]
Тот факт, что PHP изначально не был спроектирован, а вместо этого был разработан органически, привел к непоследовательному именованию функций и непоследовательному порядку их параметров. [27] В некоторых случаях имена функций выбирались так, чтобы соответствовать библиотекам более низкого уровня, которые PHP «оборачивал», [28] в то время как в некоторых очень ранних версиях PHP длина имен функций использовалась внутренне как хэш-функция , поэтому имена выбирались так, чтобы улучшить распределение хэш-значений . [29]
Зеев Сураски и Энди Гутманс переписали парсер в 1997 году и сформировали основу PHP 3, изменив название языка на рекурсивную аббревиатуру PHP: Hypertext Preprocessor . [12] [30] После этого началось публичное тестирование PHP 3, а официальный запуск состоялся в июне 1998 года. Затем Сураски и Гутманс начали новую переписку ядра PHP, создав Zend Engine в 1999 году. [31] Они также основали Zend Technologies в Рамат-Гане , Израиль . [12]
22 мая 2000 года был выпущен PHP 4 на базе Zend Engine 1.0. [12] К августу 2008 года эта ветка достигла версии 4.4.9. PHP 4 в настоящее время больше не находится в разработке, и выпуск обновлений безопасности не планируется. [32] [33]
1 июля 2004 года был выпущен PHP 5, работающий на новом движке Zend Engine II. [12] PHP 5 включал в себя новые функции, такие как улучшенная поддержка объектно-ориентированного программирования , расширение PHP Data Objects (PDO) (определяющее легкий и последовательный интерфейс для доступа к базам данных), а также многочисленные улучшения производительности. [34] В 2008 году PHP 5 стал единственной стабильной версией, находящейся в разработке. Позднее статическое связывание отсутствовало в предыдущих версиях PHP и было добавлено в версии 5.3. [35] [36]
Многие известные проекты с открытым исходным кодом прекратили поддержку PHP 4 в новом коде с 5 февраля 2008 года из-за инициативы GoPHP5, [37] предоставленной консорциумом разработчиков PHP, продвигающим переход с PHP 4 на PHP 5. [38] [39]
Со временем интерпретаторы PHP стали доступны на большинстве существующих 32- и 64-битных операционных систем, либо путем их сборки из исходного кода PHP, либо с использованием готовых двоичных файлов. [40] Для версий PHP 5.3 и 5.4 единственными доступными двоичными дистрибутивами Microsoft Windows были 32-битные сборки IA-32 , [41] [42] требующие режима совместимости Windows 32-бит при использовании Internet Information Services (IIS) на 64-битной платформе Windows. PHP версии 5.5 сделала 64-битные сборки x86-64 доступными для Microsoft Windows. [43]
Официальная поддержка безопасности PHP 5.6 закончилась 31 декабря 2018 года. [44]
PHP получил неоднозначные отзывы из-за отсутствия собственной поддержки Unicode на уровне ядра языка. [45] [46] В 2005 году был инициирован проект под руководством Андрея Змиевского с целью внедрения собственной поддержки Unicode в PHP путем внедрения библиотеки International Components for Unicode (ICU) и представления текстовых строк как UTF-16 внутри. [47] Поскольку это привело бы к серьезным изменениям как во внутренних компонентах языка, так и в пользовательском коде, планировалось выпустить ее как версию 6.0 языка вместе с другими основными функциями, находившимися на тот момент в разработке. [48]
Однако нехватка разработчиков, которые понимали необходимые изменения, и проблемы с производительностью, возникающие при преобразовании в UTF-16 и из него, который редко используется в веб-контексте, привели к задержкам в проекте. [49] В результате в 2009 году был создан релиз PHP 5.3, в котором многие не-Unicode-функции были перенесены из PHP 6, в частности пространства имен. В марте 2010 года проект в его нынешнем виде был официально закрыт, и был подготовлен релиз PHP 5.4, содержащий большинство оставшихся не-Unicode-функций из PHP 6, таких как черты и повторное связывание замыканий. [50] Первоначально надеялись, что будет сформирован новый план для интеграции Unicode, но к 2014 году ни один из них не был принят. [ необходима цитата ]
В 2014 и 2015 годах была разработана новая основная версия PHP, PHP 7. Нумерация этой версии вызвала некоторые дебаты среди внутренних разработчиков. [51] Хотя эксперименты PHP 6 Unicode никогда не были опубликованы, несколько статей и названий книг ссылались на названия PHP 6, что могло вызвать путаницу, если бы новый релиз повторно использовал это название. [52] После голосования было выбрано название PHP 7. [53]
Основой PHP 7 является ветвь PHP , которая изначально называлась PHP следующего поколения ( phpng ). Ее авторами были Дмитрий Стогов, Синьчэн Хуэй и Никита Попов [54] , и она была направлена на оптимизацию производительности PHP путем рефакторинга Zend Engine при сохранении практически полной языковой совместимости. [55] К 14 июля 2014 года тесты на основе WordPress , которые служили основным набором тестов для проекта phpng, показали почти 100%-ный рост производительности. Изменения в phpng облегчают повышение производительности в будущих версиях, поскольку более компактные структуры данных и другие изменения рассматриваются как более подходящие для успешной миграции на компилятор just-in-time (JIT). [56] Из-за существенных изменений переработанный Zend Engine был назван Zend Engine 3 , став преемником Zend Engine 2, используемого в PHP 5. [57]
Из-за крупных внутренних изменений в phpng, он должен получить новый основной номер версии PHP, а не второстепенный релиз PHP 5, согласно процессу выпуска PHP. [58] Основные версии PHP могут нарушать обратную совместимость кода, и поэтому PHP 7 предоставил возможность для других улучшений за пределами phpng, которые требуют нарушений обратной совместимости. [ необходима цитата ] В частности, он включал следующие изменения:
->
, []
, ()
, {}
, и ::
с произвольными осмысленными выражениями левой стороны. [60]foreach
было изменено, чтобы стать более предсказуемым. [62]mysql
расширение. [64]list()
было изменено, чтобы удалить поддержку строк. [65]<%
и . [66%>
]<script language="php"> ... </script>
default
PHP 7 также включал новые языковые возможности. В частности, он ввел объявления возвращаемых типов для функций [71] , которые дополняют существующие объявления типов параметров, и поддержку скалярных типов (целое число, число с плавающей точкой, строка и логическое значение) в объявлениях параметров и возвращаемых типов. [72]
PHP 8 был выпущен 26 ноября 2020 года и в настоящее время является второй по частоте использования основной версией PHP. PHP 8 является основной версией и имеет критические изменения по сравнению с предыдущими версиями. [73] [74] Новые функции и заметные изменения включают в себя:
Компиляция JIT поддерживается в PHP 8. [75]
JIT-компилятор PHP 8 может обеспечить существенное улучшение производительности для некоторых вариантов использования, [76] [77] в то время как (тогдашний) разработчик PHP Никита Попов заявил, что улучшение производительности для большинства веб-сайтов будет менее существенным, чем при обновлении с PHP 5 до PHP 7. [78] Значительные улучшения ожидаются больше для математических операций, чем для обычных вариантов использования веб-разработки. [78] Кроме того, JIT-компилятор обеспечивает будущий потенциал для перемещения части кода с C на PHP из-за улучшения производительности для некоторых вариантов использования. [79]
В PHP 8 появилось это match
выражение. [80] Выражение match концептуально похоже на switch
оператор и является более компактным для некоторых случаев использования. [81] Поскольку match
является выражением, его результат может быть присвоен переменной или возвращен из функции. [82]
В PHP 8 появились типы объединений, новый static
тип возвращаемого значения и новый mixed
тип. [73]
В PHP 8 были добавлены «атрибуты», которые в других языках программирования часто называют «аннотациями», позволяющие добавлять метаданные к классам. [73]
throw
был изменен с утверждения на выражение. [83] Это позволяет создавать исключения в местах, которые ранее были невозможны. [73]
PHP 8 включает изменения, позволяющие использовать альтернативные, более краткие или более последовательные синтаксисы в ряде сценариев. Например, оператор nullsafe похож на оператор объединения null ??
, но используется при вызове методов. [84] Следующий фрагмент кода не выдаст ошибку, если getBirthday()
вернет null:
$human_readable_date = $user -> getBirthday () ?-> diffForHumans ();
Добавлено продвижение свойств конструктора как « синтаксический сахар », позволяющий автоматически устанавливать свойства класса при передаче параметров в конструктор класса . [73] Это сокращает объем шаблонного кода , который необходимо написать. [85]
Другие незначительные изменения включают поддержку использования ::class
on объектов, которая служит альтернативой использованию get_class()
; [73] не захватывающие перехваты в блоках try-catch; настройки синтаксиса переменных для устранения несоответствий; поддержку именованных аргументов; и поддержку конечных запятых в списках параметров, что добавляет согласованности с поддержкой конечных запятых в других контекстах, например, в массивах. [74]
WeakMap
содержит ссылки на объекты, но эти ссылки не предотвращают сборку мусора для таких объектов . [86] Это может обеспечить повышение производительности в сценариях, где данные кэшируются ; это особенно актуально для объектно-реляционных отображений (ORM). [73]DateTime
объектов из интерфейсов и добавление интерфейса Stringable
, который можно использовать для подсказки типов. [73]str_contains()
str_starts_with()
str_ends_with()
fdiv()
get_debug_type()
get_resource_id()
token_get_all()
PHP 8.1 был выпущен 25 ноября 2021 года. [89] Он добавил поддержку перечислений (также называемых «перечислениями»), объявление свойств как readonly
(что предотвращает изменение свойства после инициализации) и распаковку массива со строковыми ключами. Новый тип never может использоваться для указания того, что функция не возвращает значение. [90]
PHP 8.2 был выпущен 8 декабря 2022 года. [91] Новым в этом выпуске являются readonly
классы (свойства экземпляров которых неявно доступны только для чтения), типы дизъюнктивной нормальной формы (DNF) и random
расширение, которое предоставляет генератор псевдослучайных чисел с объектно-ориентированным API , [92] редактирование значений чувствительных параметров и множество других функций.
Версия | Дата выпуска | Поддерживается до [93] | Примечания |
---|---|---|---|
Старая версия, больше не поддерживается: 1.0 | 8 июня 1995 г. | Официально называется «Personal Home Page Tools (PHP Tools)». Это первое использование названия «PHP». [12] | |
Старая версия, больше не поддерживается: 2.0 | 1 ноября 1997 г. | Официально называется "PHP/FI 2.0". Это первый релиз, который можно было бы фактически охарактеризовать как PHP, являющийся самостоятельным языком со многими функциями, сохранившимися до наших дней. | |
Старая версия, больше не поддерживается: 3.0 | 6 июня 1998 г. | 20 октября 2000 г. [93] | Разработка переходит от одного человека к нескольким разработчикам. Зеев Сураски и Энди Гутманс переписали базу для этой версии. [12] |
Старая версия, больше не поддерживается: 4.0 | 22 мая 2000 г. [94] | 23 июня 2001 г. [93] | Добавлена более продвинутая двухэтапная система анализа/выполнения тегов, называемая движком Zend. [95] |
Старая версия, больше не поддерживается: 4.1 | 10 декабря 2001 г. [96] | 12 марта 2002 г. [93] | Введены «суперглобальные» ( $_GET , $_POST , $_SESSION , и т.д.) [95] |
Старая версия, больше не поддерживается: 4.2 | 22 апреля 2002 г. [97] | 6 сентября 2002 г. [93] | По умолчанию отключено register_globals . Данные, полученные по сети, больше не вставляются напрямую в глобальное пространство имен, закрывая возможные дыры в безопасности приложений. [95] |
Старая версия, больше не поддерживается: 4.3 | 27 декабря 2002 г. [98] | 31 марта 2005 г. [93] | Введен интерфейс командной строки (CLI) в дополнение к CGI. [95] [99] |
Старая версия, больше не поддерживается: 4.4 | 11 июля 2005 г. [100] | 7 августа 2008 г. [93] | Исправлена ошибка повреждения памяти, которая требовала нарушения двоичной совместимости с расширениями, скомпилированными для PHP версии 4.3.x. [101] |
Старая версия, больше не поддерживается: 5.0 | 13 июля 2004 г. [102] | 5 сентября 2005 г. [93] | Zend Engine II с новой объектной моделью. [103] |
Старая версия, больше не поддерживается: 5.1 | 24 ноября 2005 г. [104] | 24 августа 2006 г. [93] | Улучшения производительности с введением переменных компилятора в переработанном PHP Engine. [103] Добавлены PHP Data Objects (PDO) в качестве последовательного интерфейса для доступа к базам данных. [105] |
Старая версия, больше не поддерживается: 5.2 | 2 ноября 2006 г. [106] | 6 января 2011 г. [93] | Включено расширение фильтра по умолчанию. Собственная поддержка JSON . [103] |
Старая версия, больше не поддерживается: 5.3 | 30 июня 2009 г. [107] | 14 августа 2014 г. [93] | Поддержка пространств имен ; позднее статическое связывание , метка перехода (ограниченный goto ), анонимные функции , замыкания , архивы PHP (phar), сборка мусора для циклических ссылок, улучшенная поддержка Windows , sqlite3, mysqlnd в качестве замены libmysql в качестве базовой библиотеки для расширений, работающих с MySQL , fileinfo в качестве замены mime_magic для лучшей поддержки MIME , расширение интернационализации и прекращение использования расширения ereg. |
Старая версия, больше не поддерживается: 5.4 | 1 марта 2012 г. [108] | 3 сентября 2015 г. [93] | Поддержка признаков , поддержка синтаксиса коротких массивов. Удалены элементы: register_globals , safe_mode , allow_call_time_pass_reference , , и . Встроенный веб-сервер. [109] Несколько улучшений существующих функций, производительности и сниженных требований к памяти.session_register() session_unregister() session_is_registered() |
Старая версия, больше не поддерживается: 5.5 | 20 июня 2013 г. [110] | 10 июля 2016 г. [111] | Поддержка генераторов , finally блоков для обработки исключений, OpCache (на основе Zend Optimizer+) включена в официальный дистрибутив. [112] |
Старая версия, больше не поддерживается: 5.6 | 28 августа 2014 г. [113] | 31 декабря 2018 г. [111] | Константные скалярные выражения, вариативные функции , распаковка аргументов, новый оператор возведения в степень, расширения оператора use для функций и констант, новый phpdbg отладчик как модуль SAPI и другие более мелкие улучшения. [114] |
6.х | Не выпущено | — | Заброшенная версия PHP, в которую планировалось включить собственную поддержку Unicode. [115] [116] |
Старая версия, больше не поддерживается: 7.0 | 3 декабря 2015 г. [117] | 10 января 2019 г. [58] | Zend Engine 3 (улучшения производительности [56] и поддержка 64-битных целых чисел в Windows [118] ), единый синтаксис переменных, [60] процесс компиляции на основе AST , [119] добавлено , [120] согласованность побитового сдвига между платформами, [121] оператор ( объединение null ), [122] синтаксис escape- кода Unicode , [123] объявления возвращаемого типа, [71] объявления скалярного типа (целое число, число с плавающей точкой, строка и логическое значение), [72] оператор сравнения трех "космический корабль" , [124] делегирование генератора , [125] анонимные классы , [126] более простой и более последовательно доступный API CSPRNG , [127] замена многих оставшихся внутренних "ошибок" PHP более современными исключениями , [59] и сокращенный синтаксис для импорта нескольких элементов из пространства имен. [128]Closure::call() ?? <=> |
Старая версия, больше не поддерживается: 7.1 | 1 декабря 2016 г. | 1 декабря 2019 г. [111] | iterable тип, [129] типы, допускающие значение null, [130] void возвращаемый тип , [131] модификаторы видимости констант класса , [132] синтаксис короткого списка, [133] multi-catch [134] |
Старая версия, больше не поддерживается: 7.2 | 30 ноября 2017 г. | 30 ноября 2020 г. [111] | Параметр объекта и объявление типа возвращаемого значения, [135] расширение libsodium, [136] переопределение абстрактного метода, [137] расширение типа параметра [138] |
Старая версия, больше не поддерживается: 7.3 | 6 декабря 2018 г. [139] | 6 декабря 2021 г. | Гибкий синтаксис Heredoc и Nowdoc, [140] поддержка назначения ссылок и деконструкции массива с помощью , [141] поддержка PCRE2, [142] функция [143]list() hrtime |
Старая версия, больше не поддерживается: 7.4 | 28 ноября 2019 г. [144] | 28 ноября 2022 г. | Типизированные свойства 2.0, [145] предварительная загрузка, [146] оператор присваивания с объединением null, [147] улучшение openssl_random_pseudo_bytes , [148] слабые ссылки, [86] интерфейс внешних функций (FFI), [149] всегда доступное расширение хеша, [150] реестр хешей паролей, [151] разделение многобайтовых строк, [152] отражение для ссылок, [153] разделение ext/wddx, [154] новый механизм сериализации пользовательских объектов [155] |
Старая версия, больше не поддерживается: 8.0 | 26 ноября 2020 г. [156] | 26 ноября 2023 г. | Компиляция Just-In-Time (JIT) , [75] массивы, начинающиеся с отрицательного индекса, [157] более строгая/разумная семантика языка (проверка для абстрактных методов-характеристик), [158] более разумное сравнение строк с числами, [159] более разумные числовые строки, [160] TypeError о недопустимых арифметических/побитовых операторах, [161] переклассификация различных ошибок движка, [162] ошибки согласованного типа для внутренних функций, [163] фатальная ошибка для несовместимых сигнатур методов [164] ), преобразование числа с плавающей точкой в строку, не зависящее от локали, [165] корректировки синтаксиса переменных, [166] атрибуты, [167] [ 168] [169] [170] именованные аргументы, [171] выражение соответствия, [172] продвижение свойства конструктора, [173] типы объединений, [174] mixed тип, [175] статический возвращаемый тип, [176] оператор nullsafe, [84] не захватывающие перехваты, [177] throw выражение, [83] расширение JSON всегда доступно. [178] |
Старая версия, но она все еще поддерживается: 8.1 | 25 ноября 2021 г. [179] | 31 декабря 2025 г. | Явная восьмеричная целочисленная литеральная нотация, [180] перечисления, [181] свойства только для чтения, [182] синтаксис вызова первого класса, [183] new в инициализаторах, [184] чистые типы пересечения, [185] never возвращаемый тип, [186] final ограничения класса, [187] волокна [188] |
Старая версия, но она все еще поддерживается:8.2 | 8 декабря 2022 г. [189] | 31 декабря 2026 г. | Классы только для чтения [190] null , false и true как автономные типы [191] [192] преобразование регистра, не зависящее от локали [193] типы дизъюнктивной нормальной формы [194] константы в признаках [195] |
Текущая стабильная версия: 8.3 | 23 ноября 2023 г. [196] | 31 декабря 2027 г. | Типизированные константы класса, [197] динамическая выборка констант класса, [198] атрибут, [199] глубокое клонирование свойств, доступных только для чтения, [200] новая функция, [201] дополнения к рандомизатору, [202] командная строка linter поддерживает несколько файлов#[\Override] json_validate |
Будущий релиз: 8.4 | 21 ноября 2024 г. [203] | 31 декабря 2028 г. | |
Легенда: Старая версия, не поддерживается Старая версия, все еще поддерживается Последняя версия Последняя предварительная версия Будущий релиз |
Начиная с 28 июня 2011 года команда разработчиков PHP внедрила график выпуска новых версий PHP. [58] Согласно этой системе, по крайней мере один релиз должен выходить каждый месяц. Один раз в год должен выходить второстепенный релиз, который может включать новые функции. Каждый второстепенный релиз должен поддерживаться по крайней мере в течение двух лет исправлениями безопасности и ошибок, за которыми следует по крайней мере один год исправлений только безопасности, в общей сложности трехлетний процесс выпуска для каждого второстепенного релиза. Никакие новые функции, если только они не небольшие и самодостаточные, не должны вводиться в второстепенный релиз в течение трехлетнего процесса выпуска.
Талисманом проекта PHP является elePHPant , синий слон с логотипом PHP на боку, разработанный Винсентом Понтье [204] в 1998 году. [205] «Буквы (PHP) образовывали форму слона, если смотреть под углом сбоку». [206] Иногда elePHPant имеет другой цвет, когда находится в форме плюшевой игрушки . [207]
За эти годы было создано множество вариаций этого талисмана. Только elePHPants, основанные на оригинальном дизайне Винсента Понтье, считаются официальными сообществом. [208] Они коллекционные, и некоторые из них чрезвычайно редки. [209]
Следующая программа «Hello, World!» написана на PHP-коде, встроенном в HTML- документ:
<!DOCTYPE html> < html > < head > < title > Программа PHP "Привет, мир!" </ title > </ head > < body > < p > <? = 'Привет, мир!' ?> </ p > </ body > </ html >
Однако, поскольку не существует требования о том, чтобы PHP-код был встроен в HTML, простейшая версия Hello, World! может быть написана следующим образом, с опущенным закрывающим тегом, ?>
что предпочтительнее в файлах, содержащих чистый PHP-код. [210]
<?php echo 'Привет, мир!' ;
Интерпретатор PHP выполняет только PHP-код внутри своих разделителей . Все, что находится за пределами его разделителей, PHP не обрабатывает, хотя не-PHP-текст по-прежнему подчиняется управляющим структурам, описанным в PHP-коде. Наиболее распространенными разделителями являются <?php
открывающие и ?>
закрывающие PHP-разделы. <?
Также существует сокращенная форма. Этот короткий разделитель делает файлы скриптов менее переносимыми, поскольку их поддержка может быть отключена в локальной конфигурации PHP, и поэтому его использование не рекомендуется. [211] [212] И наоборот, нет никаких рекомендаций против короткого тега echo <?=
. [213] До PHP 5.4.0 этот короткий синтаксис for echo
работал только при short_open_tag
включенной настройке конфигурации, тогда как для PHP 5.4.0 и более поздних версий он всегда доступен. [214] [215] [211] Цель всех этих разделителей — отделить PHP-код от не-PHP-контента, такого как код JavaScript или HTML-разметка. [216] Таким образом, самая короткая программа "Hello, World!", написанная на PHP, выглядит так:
<? = 'Привет, мир!' ;
Первая форма разделителей, <?php
и ?>
, в XHTML и других XML- документах создает правильно сформированные инструкции по обработке XML. [217] Это означает, что полученная смесь PHP-кода и другой разметки в файле на стороне сервера сама по себе является правильно сформированным XML.
Переменные имеют префикс в виде символа доллара , и тип не обязательно должен быть указан заранее. В PHP 5 были введены объявления типов , которые позволяют функциям принудительно задавать свои параметры как объекты определенного класса, массивы, интерфейсы или функции обратного вызова . Однако до PHP 7 объявления типов не могли использоваться со скалярными типами, такими как целые числа или строки. [72]
Ниже приведен пример объявления и инициализации переменных PHP.
<?php $name = 'John' ; // переменная типа string объявляется и инициализируется $age = 18 ; // переменная типа integer объявляется и инициализируется $height = 5.3 ; // переменная типа double объявляется и инициализируется echo $name . ' is ' . $height . "m tall \n " ; // конкатенация переменных и строк echo " $name is $age years old." ; // интерполяция переменных в строку ?>
В отличие от имен функций и классов, имена переменных чувствительны к регистру. Как строки в двойных кавычках (""), так и строки heredoc предоставляют возможность интерполировать значение переменной в строку. [218] PHP обрабатывает новые строки как пробелы в стиле языка свободной формы , а операторы завершаются точкой с запятой. [219] PHP имеет три типа синтаксиса комментариев : /* */
помечает блочные и встроенные комментарии; //
или #
используется для однострочных комментариев. [220] Оператор echo
является одним из нескольких средств, которые PHP предоставляет для вывода текста. [ требуется ссылка ]
С точки зрения ключевых слов и синтаксиса языка PHP похож на синтаксис в стиле C. if
Условия, for
циклы while
и возвраты функций похожи по синтаксису на такие языки, как C, C++, C#, Java и Perl. [ необходима ссылка ]
PHP слабо типизирован . Он хранит целые числа в платформенно-зависимом диапазоне, как 32-, 64- или 128-битное целое число со знаком, эквивалентное типу long языка C. Беззнаковые целые числа преобразуются в знаковые значения в определенных ситуациях, что отличается от поведения многих других языков программирования. [221] Целочисленные переменные могут быть назначены с использованием десятичной (положительной и отрицательной), восьмеричной , шестнадцатеричной и двоичной нотаций. [ требуется ссылка ]
Числа с плавающей точкой также хранятся в специфичном для платформы диапазоне. Они могут быть указаны с использованием нотации с плавающей точкой или двух форм научной нотации . [222] PHP имеет собственный тип Boolean , который похож на собственные типы Boolean в Java и C++ . Используя правила преобразования типов Boolean, ненулевые значения интерпретируются как истина, а ноль как ложь, как в Perl и C++. [222]
Тип данных null представляет собой переменную, не имеющую значения; NULL
это единственное допустимое значение для этого типа данных. [222]
Переменные типа "ресурс" представляют ссылки на ресурсы из внешних источников. Они обычно создаются функциями из определенного расширения и могут обрабатываться только функциями из того же расширения; примеры включают ресурсы файлов, изображений и баз данных. [222]
Массивы могут содержать элементы любого типа, с которыми может работать PHP, включая ресурсы, объекты и даже другие массивы. Порядок сохраняется в списках значений и в хэшах как с ключами, так и со значениями, и их можно смешивать. [222] PHP также поддерживает строки , которые можно использовать с одинарными кавычками, двойными кавычками, синтаксисом nowdoc или heredoc . [223]
Стандартная библиотека PHP (SPL) пытается решить стандартные проблемы и реализует эффективные интерфейсы и классы доступа к данным. [224]
PHP определяет большой массив функций в основном языке, и многие из них также доступны в различных расширениях; эти функции хорошо документированы в онлайн-документации PHP. [225] Однако встроенная библиотека имеет широкий спектр соглашений об именовании и связанных с ними несоответствий, как описано в разделе «История» выше.
Разработчик может определить пользовательские функции:
function myAge ( int $birthYear ) : string { // вычислить возраст, вычитая год рождения из текущего года. $yearsOld = date ( 'Y' ) - $birthYear ; // вернуть возраст в описательной строке. return $yearsOld . ( $yearsOld == 1 ? ' year' : ' years' ); }echo 'В настоящее время мне ' . myAge ( 1995 ) . ' старый.' ;
По состоянию на 2024 год результатом работы приведенного выше примера программы будет «Мне сейчас 29 лет».
Вместо указателей на функции , на функции в PHP можно ссылаться с помощью строки, содержащей их имя. Таким образом, обычные функции PHP могут использоваться, например, в качестве обратных вызовов или в таблицах функций . [226] Пользовательские функции могут быть созданы в любое время без прототипирования . [225] [226] Функции могут быть определены внутри блоков кода, что позволяет во время выполнения принять решение о том, следует ли определять функцию. Существует function_exists
функция, которая определяет, была ли уже определена функция с заданным именем. Вызовы функций должны использовать скобки, за исключением функций конструктора класса с нулевым аргументом, вызываемых с помощью оператора PHP new
, в этом случае скобки необязательны. [ необходима цитата ]
Начиная с PHP 4.0.1 create_function()
, тонкая оболочка вокруг eval()
, позволяла создавать обычные функции PHP во время выполнения программы; она была объявлена устаревшей в PHP 7.2 и удалена в PHP 8.0 [227] в пользу синтаксиса для анонимных функций или " замыканий " [228] , которые могут захватывать переменные из окружающей области видимости, что было добавлено в PHP 5.3. Синтаксис сокращенной стрелки был добавлен в PHP 7.4: [229]
функция getAdder ( $x ) { return fn ( $y ) => $x + $y ; }$adder = getAdder ( 8 ); echo $adder ( 2 ); // выводит "10"
В приведенном выше примере getAdder()
функция создает замыкание, используя переданный аргумент $x
, который принимает дополнительный аргумент $y
и возвращает созданное замыкание вызывающей стороне. Такая функция является объектом первого класса, что означает, что ее можно сохранить в переменной, передать в качестве параметра другим функциям и т. д. [230]
Необычно для динамически типизированного языка, PHP поддерживает объявления типов для параметров функций, которые применяются во время выполнения. Это поддерживается для классов и интерфейсов с PHP 5.0, для массивов с PHP 5.1, для "вызываемых" с PHP 5.4 и скалярных (целочисленных, с плавающей точкой, строковых и логических) типов с PHP 7.0. [72] PHP 7.0 также имеет объявления типов для возвращаемых функций, выраженные путем помещения имени типа после списка параметров с предшествующим двоеточием. [71] Например, getAdder
функция из предыдущего примера может быть аннотирована типами следующим образом в PHP 7:
функция getAdder ( int $x ) : Закрытие { return fn ( int $y ) : int => $x + $y ; }$adder = getAdder ( 8 ); echo $adder ( 2 ); // выводит "10" echo $adder ( null ); // выдает исключение, так как был передан неверный тип $adder = getAdder ([]); // также выдаст исключение
По умолчанию, объявления скалярных типов следуют принципам слабой типизации. Так, например, если тип параметра — int
, PHP разрешит передачу в эту функцию не только целых чисел, но и преобразуемых числовых строк, чисел с плавающей точкой или булевых значений и преобразует их. [72] Однако в PHP 7 есть режим «строгой типизации», который при использовании запрещает такие преобразования для вызовов функций и возвратов в файле. [72]
Базовая функциональность объектно-ориентированного программирования была добавлена в PHP 3 и улучшена в PHP 4. [12] Это позволило PHP получить дополнительную абстракцию, упростив творческие задачи для программистов, использующих язык. Обработка объектов была полностью переписана для PHP 5, что расширило набор функций и повысило производительность. [231] В предыдущих версиях PHP объекты обрабатывались как типы значений . [231] Недостатком этого метода было то, что код должен был интенсивно использовать «ссылочные» переменные PHP, если он хотел изменить переданный ему объект, а не создавать его копию. В новом подходе объекты ссылаются по handle , а не по value. [ необходима цитата ]
PHP 5 представил закрытые и защищенные переменные-члены и методы, а также абстрактные классы , окончательные классы , абстрактные методы и окончательные методы . Он также представил стандартный способ объявления конструкторов и деструкторов , аналогичный другим объектно-ориентированным языкам, таким как C++ , и стандартную модель обработки исключений . Кроме того, PHP 5 добавил интерфейсы и позволил реализовать несколько интерфейсов. Существуют специальные интерфейсы, которые позволяют объектам взаимодействовать с системой выполнения. Объекты , реализующие ArrayAccess, можно использовать с синтаксисом массива , а объекты, реализующие Iterator или IteratorAggregate, можно использовать с foreach
языковой конструкцией . В движке нет функции виртуальной таблицы , поэтому статические переменные привязываются к имени, а не к ссылке во время компиляции. [232]
Если разработчик создает копию объекта, используя зарезервированное слово clone
, движок Zend проверит, __clone()
определен ли метод. Если нет, он вызовет метод по умолчанию __clone()
, который скопирует свойства объекта. Если __clone()
метод определен, то он будет отвечать за установку необходимых свойств в созданном объекте. Для удобства движок предоставит функцию, которая импортирует свойства исходного объекта, поэтому программист может начать с реплики исходного объекта по значению и переопределить только те свойства, которые необходимо изменить. [233]
Видимость свойств и методов PHP определяется с помощью ключевых слов , , и . Значение по умолчанию — public, если используется только var; является синонимом для . Объявленные элементы могут быть доступны отовсюду. ограничивает доступ к унаследованным классам ( и к классу, который определяет элемент). ограничивает видимость только к классу, который определяет элемент. [234] Объекты одного типа имеют доступ к закрытым и защищенным членам друг друга, даже если они не являются одним и тем же экземпляром. [ необходима цитата ] public
private
protected
var
public
public
protected
private
Ниже приведен базовый пример объектно-ориентированного программирования в PHP 8:
<?phpабстрактный класс Пользователь{ защищенная строка $name ; публичная функция __construct ( строка $name ) { // делаем первую букву заглавной, а остальные строчными $this -> name = ucfirst ( strtolower ( $name )); } публичная функция greet () : строка { return "Привет, меня зовут " . $this -> name ; } абстрактная публичная функция job () : string ;}класс Студент расширяет Пользователь{ публичная функция __construct ( строка $name , частная строка $course ) { родитель :: __construct ( $name ); } публичная функция job () : строка { вернуть "Я изучаю" . $this -> course ; }}класс Учитель расширяет Пользователь{ публичная функция __construct ( строка $name , закрытый массив $teachingCourses ) { родитель :: __construct ( $name ); } публичная функция job () : строка { return "Я преподаю" . implode ( "", " , $this -> teachingCourses ); }}$студенты = [ новый студент ( «Алиса» , «Информатика» ), новый студент ( «Боб» , «Компьютерные науки» ), новый студент ( «Чарли» , «Бизнес-исследования» ),];$учителя = [ новый Учитель ( "Дэн" , [ "Информатика" , "Информационная безопасность" ]), новый учитель ( «Эрин» , [ «Компьютерные науки» , «Программирование 3D-графики» ]), новый учитель ( «Фрэнки» , [ «Интернет-маркетинг» , «Бизнес-исследования» , «Электронная коммерция» ]),];foreach ([ $students , $teachers ] as $users ) { echo $users [ 0 ] :: класс . "s: \n " ; array_walk ( $users , функция ( Пользователь $user ) { echo " { $user -> greet () } , { $user -> job () } \n " ; });}
Эта программа выводит следующее:
Студенты:Здравствуйте, меня зовут Алиса, я изучаю информатику.Привет, меня зовут Боб, я изучаю информатику.Здравствуйте, меня зовут Чарли, я изучаю бизнес-исследования.Учителя:Здравствуйте, меня зовут Дэн, я преподаю информатику и информационную безопасность.Здравствуйте, меня зовут Эрин, я преподаю информатику, программирование 3D-графики.Здравствуйте, меня зовут Фрэнки, я преподаю интернет-маркетинг, бизнес-исследования, электронную коммерцию.
Единственная полная реализация PHP — это оригинал, известный просто как PHP. Он наиболее широко используется и работает на Zend Engine . Чтобы отделить его от других реализаций, его иногда неофициально называют «Zend PHP». Zend Engine компилирует исходный код PHP на лету во внутренний формат, который он может выполнить, таким образом, он работает как интерпретатор . [235] [236] Это также «эталонная реализация» PHP, поскольку PHP не имеет формальной спецификации, и поэтому семантика Zend PHP определяет семантику PHP. Из-за сложной и тонкой семантики PHP, определяемой тем, как работает Zend, конкурирующим реализациям сложно предложить полную совместимость. [ необходима цитата ]
Модель PHP «один запрос на выполнение скрипта» и тот факт, что Zend Engine является интерпретатором, приводят к неэффективности; в результате были разработаны различные продукты для повышения производительности PHP. Чтобы ускорить время выполнения и не компилировать исходный код PHP каждый раз при доступе к веб-странице, PHP-скрипты также могут быть развернуты во внутреннем формате PHP-движка с помощью кэша опкодов , который работает путем кэширования скомпилированной формы PHP-скрипта (опкодов) в общей памяти, чтобы избежать накладных расходов на разбор и компиляцию кода каждый раз при запуске скрипта. Кэш опкодов, Zend Opcache , встроен в PHP с версии 5.5. [237] Другим примером широко используемого кэша опкодов является Alternative PHP Cache (APC), который доступен как расширение PECL . [238]
Хотя Zend PHP по-прежнему является самой популярной реализацией, было разработано несколько других реализаций. Некоторые из них являются компиляторами или поддерживают JIT-компиляцию , и, следовательно, предлагают преимущества в производительности по сравнению с Zend PHP за счет отсутствия полной совместимости с PHP. [ необходима цитата ] Альтернативные реализации включают следующее:
create_function()
и eval()
. [242]PHP — это свободное программное обеспечение , выпущенное по лицензии PHP , которая гласит: [243]
Продукты, полученные из этого программного обеспечения, не могут называться "PHP", и "PHP" не может появляться в их названии без предварительного письменного разрешения group@php.net. Вы можете указать, что ваше программное обеспечение работает совместно с PHP, сказав " Foo for PHP" вместо того, чтобы называть его "PHP Foo" или "phpfoo".
Это ограничение на использование «PHP» делает лицензию PHP несовместимой с лицензией GNU General Public License (GPL), в то время как лицензия Zend несовместима из-за пункта о рекламе, аналогичного пункту оригинальной лицензии BSD . [244]
PHP включает в себя различные бесплатные и открытые библиотеки в своем исходном дистрибутиве или использует их в полученных двоичных сборках PHP. PHP по сути является системой, поддерживающей Интернет , со встроенными модулями для доступа к серверам протокола передачи файлов (FTP) и многим серверам баз данных, включая PostgreSQL , MySQL , Microsoft SQL Server и SQLite (встроенная база данных), серверы LDAP и другие. Многочисленные функции, знакомые программистам на C, например, функции семейства stdio , доступны в стандартных сборках PHP. [245]
PHP позволяет разработчикам писать расширения на языке C для добавления функциональности в язык PHP. Расширения PHP могут быть скомпилированы статически в PHP или загружены динамически во время выполнения. Было написано множество расширений для добавления поддержки Windows API , управления процессами в Unix-подобных операционных системах , многобайтовых строк ( Unicode ), cURL и нескольких популярных форматов сжатия . Другие функции PHP, доступные через расширения, включают интеграцию с Internet Relay Chat (IRC), динамическую генерацию изображений и контента Adobe Flash , PHP Data Objects (PDO) в качестве уровня абстракции, используемого для доступа к базам данных, [246] [247] [248] [249] [250] [251] [252] и даже синтез речи . Некоторые из основных функций языка, такие как работа со строками и массивами, также реализованы в виде расширений. [253] Проект PHP Extension Community Library (PECL) представляет собой репозиторий для расширений языка PHP. [254]
Некоторые другие проекты, такие как Zephir , предоставляют возможность создания расширений PHP на языке высокого уровня и компиляции их в собственные расширения PHP. Такой подход, вместо написания расширений PHP непосредственно на C, упрощает разработку расширений и сокращает время, необходимое для программирования и тестирования. [255]
К декабрю 2018 года группа PHP состояла из десяти человек: Тис К. Арнтцен, Стиг Баккен, Шейн Каравео, Энди Гутманс , Расмус Лердорф , Сэм Руби , Саша Шуман, Зеев Сураски , Джим Уинстед и Андрей Змиевский . [256]
Zend Technologies предлагает программистам сертификацию PHP на основе экзамена PHP 8 [257] (ранее на основе PHP 7 и 5.5), чтобы они могли стать сертифицированными разработчиками PHP.
Формирование | 22 ноября 2021 г. ( 2021-11-22 ) |
---|---|
Основатель | Automattic , Laravel , Acquia, Zend , Private Packagist, Symfony , Craft CMS, Tideways, PrestaShop , JetBrains [258] |
Веб-сайт | https://thephp.foundation |
26 ноября 2021 года блог JetBrains объявил о создании фонда PHP Foundation, который будет спонсировать проектирование и разработку PHP. [259]
Год | Совершает | Обзоры | RFC |
---|---|---|---|
2022 [260] | 683 | 283 | 8 |
2023 [261] | 784 | 702 | 17 |
Фонд нанимает «Core Developers» для работы над основным репозиторием языка PHP. Роман Пронский, член правления фонда, сказал, что они стремятся платить «рыночные зарплаты» разработчикам. [262]
Реакция на фонд в основном была положительной, фонд хвалили за лучшую поддержку языка и помощь в остановке падения его популярности. [263] [264] Однако его также критиковали за внесение критических изменений в младшие версии PHP, например, в PHP 8.2, где инициализация членов класса вне исходной области действия класса приводила к ошибкам амортизации. [265] Эти изменения повлияли на ряд проектов с открытым исходным кодом, включая WordPress . [266]
Немецкий государственный технологический фонд выделил более 200 000 евро на поддержку PHP Foundation. [267]
Существует два основных способа добавления поддержки PHP на веб-сервер — как собственного модуля веб-сервера или как исполняемого файла CGI. PHP имеет прямой интерфейс модуля, называемый интерфейсом программирования серверных приложений (SAPI), который поддерживается многими веб-серверами, включая Apache HTTP Server , Microsoft IIS и iPlanet Web Server . Некоторые другие веб-серверы, такие как OmniHTTPd, поддерживают интерфейс программирования приложений Интернет-сервера (ISAPI), который является интерфейсом модуля веб-сервера Microsoft . Если PHP не имеет поддержки модуля для веб-сервера, его всегда можно использовать как Common Gateway Interface (CGI) или процессор FastCGI ; в этом случае веб-сервер настроен на использование исполняемого файла PHP CGI для обработки всех запросов к файлам PHP. [268]
PHP-FPM (FastCGI Process Manager) — это альтернативная реализация FastCGI для PHP, входящая в официальный дистрибутив PHP с версии 5.3.3. [269] По сравнению со старой реализацией FastCGI, она содержит некоторые дополнительные функции, в основном полезные для высоконагруженных веб-серверов. [270]
При использовании PHP для скриптов командной строки необходим исполняемый файл интерфейса командной строки PHP (CLI). PHP поддерживает интерфейс программирования приложений сервера CLI (SAPI) с PHP 4.3.0. [271] Основное внимание в этом SAPI уделяется разработке приложений оболочки с использованием PHP. Между CLI SAPI и другими SAPI есть довольно много различий, хотя они и разделяют многие из одинаковых поведений. [272]
PHP имеет прямой модульный интерфейс, называемый SAPI, для различных веб-серверов; [273] в случае PHP 5 и Apache 2.0 на Windows он предоставляется в виде файла DLL , называемого php5apache2.dll , [274] который является модулем, который, помимо других функций, предоставляет интерфейс между PHP и веб-сервером, реализованный в форме, которую понимает сервер. Эта форма известна как SAPI. [ необходима цитата ]
Существуют различные виды SAPI для различных расширений веб-сервера. Например, в дополнение к перечисленным выше, другие SAPI для языка PHP включают Common Gateway Interface и интерфейс командной строки. [273] [275]
PHP также можно использовать для написания приложений с графическим пользовательским интерфейсом (GUI) для настольных компьютеров с помощью «PHP Desktop».или прекращенное расширение PHP-GTK . PHP-GTK не включен в официальный дистрибутив PHP, [268] и как расширение, он может использоваться только с версиями PHP 5.1.0 и новее. Наиболее распространенный способ установки PHP-GTK — компиляция из исходного кода. [276]
При установке и использовании PHP в облачных средах предоставляются комплекты средств разработки программного обеспечения (SDK) для использования облачных функций. [ необходима ссылка ] Например:
Поддерживаются многочисленные параметры конфигурации, влияющие как на основные функции PHP, так и на расширения. [279] [280] Поиск файла конфигурации php.ini
осуществляется в разных местах в зависимости от способа использования PHP. [281] Файл конфигурации разделен на несколько разделов, [282] а некоторые параметры конфигурации можно также задать в конфигурации веб-сервера. [283]
PHP — это язык сценариев общего назначения, который особенно подходит для серверной веб-разработки , в этом случае PHP обычно работает на веб-сервере . Любой PHP-код в запрошенном файле выполняется средой выполнения PHP, обычно для создания динамического содержимого веб-страницы или динамических изображений, используемых на веб-сайтах или в других местах. [284] Его также можно использовать для сценариев командной строки и клиентских графических пользовательских интерфейсов (GUI). PHP можно развернуть на большинстве веб-серверов, многих операционных системах и платформах , а также использовать со многими реляционными системами управления базами данных (RDBMS). Большинство провайдеров веб-хостинга поддерживают PHP для использования своими клиентами. Он доступен бесплатно, и PHP Group предоставляет пользователям полный исходный код для создания, настройки и расширения для собственного использования. [18]
Первоначально разработанный для создания динамических веб-страниц , PHP теперь в основном фокусируется на скриптах на стороне сервера , [285] и он похож на другие языки скриптов на стороне сервера, которые предоставляют динамический контент с веб-сервера на клиент , такие как Python , ASP.NET от Microsoft , JavaServer Pages от Sun Microsystems , [ 286] и . PHP также привлек разработку многих программных фреймворков , которые предоставляют строительные блоки и структуру дизайна для содействия быстрой разработке приложений (RAD). [ необходима ссылка ] Некоторые из них включают PRADO , CakePHP , Symfony , CodeIgniter , Laravel , Yii Framework , Phalcon и Laminas , предлагающие функции, похожие на другие веб-фреймворки .mod_perl
Архитектура LAMP стала популярной в веб-индустрии как способ развертывания веб-приложений. [287] PHP обычно используется как P в этом пакете наряду с Linux , Apache и MySQL , хотя P может также относиться к Python , Perl или некоторой смеси этих трех. Похожие пакеты, WAMP и MAMP , также доступны для Windows и macOS , причем первая буква обозначает соответствующую операционную систему. Хотя и PHP, и Apache предоставляются как часть базовой установки macOS, пользователи этих пакетов ищут более простой механизм установки, который можно было бы легче поддерживать в актуальном состоянии. [ необходима цитата ]
Для конкретных и более сложных сценариев использования PHP предлагает четко определенный и документированный способ написания пользовательских расширений на C или C++ . [288] [289] [290] [291] [292] [293] [294] [ необходим неосновной источник ] Помимо расширения самого языка в виде дополнительных библиотек , расширения предоставляют способ повышения скорости выполнения там, где это критично и есть возможности для улучшений с помощью настоящего компилируемого языка . [295] [296] PHP также предлагает четко определенные способы встраивания себя в другие программные проекты. Таким образом, PHP можно легко использовать в качестве внутреннего языка сценариев для другого проекта, также обеспечивая тесное взаимодействие с конкретными внутренними структурами данных проекта . [297]
PHP получил неоднозначные отзывы из-за отсутствия поддержки многопоточности на уровне ядра языка, [298] хотя использование потоков стало возможным благодаря расширению PECL «pthreads» . [299] [300]
Были созданы интерфейс командной строки, php-cli и два скриптовых движка ActiveX Windows Script Host для PHP. [ необходима ссылка ]
PHP используется в системах управления веб-контентом , включая MediaWiki , [301] WordPress , [302] Joomla , [303] Drupal , [304] Moodle , [305] eZ Publish , eZ Platform и SilverStripe . [306]
По состоянию на январь 2013 года [обновлять]PHP использовался на более чем 240 миллионах веб-сайтов (39% из выбранных) и был установлен на 2,1 миллиона веб-серверов . [307]
По состоянию на 27 октября 2024 года [обновлять](спустя 11 месяцев после выпуска PHP 8.3) PHP используется в качестве языка программирования на стороне сервера на 75,8% веб-сайтов, где язык может быть определен; PHP 7 является наиболее используемой версией языка, 51% веб-сайтов, использующих PHP, находятся на этой версии, в то время как 35,3% используют PHP 8, 13,5% используют PHP 5 и 0,1% используют PHP 4. [20]
В 2019 году 11% всех уязвимостей, перечисленных в Национальной базе данных уязвимостей, были связаны с PHP; [312] исторически около 30% всех уязвимостей, перечисленных с 1996 года в этой базе данных, связаны с PHP. Технические недостатки безопасности самого языка или его основных библиотек встречаются нечасто (22 в 2009 году, около 1% от общего числа, хотя PHP применяется примерно к 20% перечисленных программ). [313] Признавая, что программисты допускают ошибки, некоторые языки включают проверку на наличие заражений для автоматического обнаружения отсутствия проверки входных данных , что вызывает много проблем. Такая функция была предложена для PHP в прошлом, но была либо отклонена, либо предложение было снято. [314] [315] [316]
Сторонние проекты, такие как Suhosin [317] и Snuffleupagus [318], направлены на удаление или изменение опасных частей языка.
Исторически старые версии PHP имели некоторые параметры конфигурации и значения по умолчанию для таких настроек времени выполнения, которые делали некоторые приложения PHP уязвимыми для проблем безопасности. Среди них magic_quotes_gpc
и register_globals
[319] директивы конфигурации были наиболее известны; последние делали любые параметры URL переменными PHP, открывая путь для серьезных уязвимостей безопасности, позволяя злоумышленнику устанавливать значение любой неинициализированной глобальной переменной и вмешиваться в выполнение скрипта PHP. Поддержка параметров " magic quotes " и "register globals" была объявлена устаревшей с PHP 5.3.0 и удалена с PHP 5.4.0. [320]
Другой пример потенциальной уязвимости настроек времени выполнения возникает, когда не отключено выполнение PHP (например, с помощью engine
директивы конфигурации) [321] для каталога, в котором хранятся загруженные файлы; включение этой директивы может привести к выполнению вредоносного кода, встроенного в загруженные файлы. [322] [323] [324] Лучше всего либо разместить каталог изображений вне корневого каталога документов, доступного веб-серверу, и обслуживать его через промежуточный скрипт, либо отключить выполнение PHP для каталога, в котором хранятся загруженные файлы. [ необходима цитата ]
Кроме того, включение динамической загрузки расширений PHP (через enable_dl
директиву конфигурации) [325] в среде общего веб-хостинга может привести к проблемам безопасности. [326] [327]
Неявные преобразования типов , которые приводят к тому, что разные значения рассматриваются как равные, иногда вопреки намерениям программиста, могут привести к проблемам безопасности. Например, результатом сравнения '0e1234' == '0'
является true
, поскольку строки, которые можно анализировать как числа, преобразуются в числа; в этом случае первое сравниваемое значение рассматривается как научная запись, имеющая значение (0 × 10 1234 ), что равно нулю. Ошибки, подобные этой, привели к уязвимостям аутентификации в Simple Machines Forum , [328] Typo3 [329] и phpBB [330] при сравнении хэшей паролей MD5 . Рекомендуемый способ — использовать (для обеспечения безопасности атаки по времени ) или оператор идентификации ( ), как в результате . [ необходима цитата ]hash_equals()
strcmp
===
'0e1234' === '0'
false
В анализе более 170 000 случаев порчи веб-сайтов , опубликованном Zone-H в 2013 году , наиболее часто (53%) используемой техникой была эксплуатация уязвимости включения файлов , в основном связанной с небезопасным использованием языковых конструкций PHP include
, require
и allow_url_fopen
. [331] [332]
PHP включает rand()
[333] и функции, которые используют генератор псевдослучайных чисел , и не являются криптографически безопасными. Начиная с версии 8.1, функция включена, которая использует криптографически безопасный источник случайности, предоставляемый системой. [335]mt_rand()[334]
random_int()
Существует две атаки, которые можно выполнить через источники энтропии PHP: «атака с исходным кодом» и «атака с восстановлением состояния». [ требуется ссылка ] По состоянию на 2012 год графический процессор стоимостью 250 долларов может выполнять до 230 вычислений MD5 в секунду, в то время как графический процессор стоимостью 750 долларов может выполнять в четыре раза больше вычислений одновременно. [336] В сочетании с « атакой дня рождения » это может привести к серьезным уязвимостям безопасности. [ требуется ссылка ]
Команда разработчиков PHP предоставляет официальные исправления ошибок в течение 2 лет после выпуска каждой младшей версии, после чего следуют еще 2 года, в течение которых выпускаются только исправления безопасности. [337] После этого релиз считается завершенным и официально не поддерживается.
Расширенная долгосрочная поддержка сверх этого срока доступна у коммерческих поставщиков, таких как Zend и другие [338] [339]
Заставить NaN и Infinity всегда становиться нулевыми при приведении к целому числу означает большую кросс-платформенную согласованность, а также менее удивительно, чем то, что происходит в настоящее время
На полках были книги, якобы охватывающие PHP 6, по крайней мере с 2008 года. Но в марте 2010 года релиз PHP 6 еще не вышел – на самом деле, он даже близко не вышел. Последние события говорят о том, что PHP 6 не выйдет до 2011 года – если он вообще выйдет.
Последние версии PHP были частью серии релизов 5.x, но PHP 6 не будет. "Мы собираемся пропустить [версию] 6, потому что много лет назад у нас были планы на 6, но эти планы сильно отличались от того, что мы делаем сейчас", - сказал Гутманс. Переход сразу к версии 7 позволяет избежать путаницы.
PHP — это язык программирования, на котором написан MediaWiki [...]
WordPress был [...] построен на PHP
требует PHP 5.3.2+
{{cite web}}
: CS1 maint: числовые имена: список авторов ( ссылка ){{cite web}}
: CS1 maint: неподходящий URL ( ссылка )Какой абсолютный минимум я должен знать о PHP?