PHP - это язык сценариев общего назначения, особенно подходящий для веб-разработки . [5] Первоначально он был создан датско-канадским программистом Расмусом Лердорфом в 1994 году. [6] Эталонная реализация PHP теперь производится PHP Group. [7] Изначально PHP означал персональную домашнюю страницу , [6] но теперь это означает рекурсивный инициализм PHP: препроцессор гипертекста . [8]
Парадигма | Императивный , функциональный , объектно-ориентированный , процедурный , рефлексивный |
---|---|
Разработано | Расмус Лердорф |
Разработчик | Команда разработчиков PHP, Zend Technologies |
Впервые появился | 1995 [1] |
Стабильный выпуск | 8.0.6 [2] / 6 мая 2021 г . |
Печатная дисциплина | Динамичный , слабый начиная с версии 7.0: Постепенный [3] |
Язык реализации | C (в первую очередь; некоторые компоненты C ++ ) |
Операционные системы | Unix-подобный , Windows , macOS |
Лицензия | Лицензия PHP (большая часть движка Zend под лицензией Zend Engine ) |
Расширения имени файла | .php , .phar , .phtml , .pht ,.phps |
Веб-сайт | www |
Основные реализации | |
Zend Engine , HHVM , PeachPie , Quercus , Parrot | |
Под влиянием | |
Perl , HTML , C , C ++ , Java , Tcl , [1] JavaScript , Hack [4] | |
Под влиянием | |
Взломать , JSP , ASP | |
|
Код PHP обычно обрабатывается на веб-сервере интерпретатором PHP, реализованным как модуль , демон или исполняемый файл Common Gateway Interface (CGI). На веб-сервере результат интерпретируемого и выполненного кода PHP - который может быть любым типом данных, например сгенерированным HTML или данными двоичного изображения - будет формировать весь или часть HTTP- ответа. Существуют различные системы веб-шаблонов, системы управления веб- контентом и веб-структуры, которые можно использовать для координации или облегчения генерации этого ответа. Кроме того, PHP можно использовать для многих задач программирования вне веб-контекста, таких как автономные графические приложения [9] и управление роботизированными дронами . [10] Код PHP также может быть выполнен непосредственно из командной строки .
Стандартный интерпретатор PHP, работающий на движке Zend Engine , представляет собой бесплатное программное обеспечение, выпущенное под лицензией PHP . PHP был широко перенесен и может быть бесплатно развернут на большинстве веб-серверов практически во всех операционных системах и платформах . [11]
Язык PHP развивался без письменной формальной спецификации или стандарта до 2014 года, при этом исходная реализация действовала как стандарт де-факто, которому другие реализации стремились следовать. С 2014 года продолжалась работа по созданию формальной спецификации PHP. [12]
W3Techs сообщает, что по состоянию на апрель 2021 [Обновить]года «PHP используется 79,2% всех веб-сайтов, чей серверный язык программирования нам известен». [13]
История
Ранняя история
Разработка PHP началась в 1994 году, когда Расмус Лердорф написал несколько программ Common Gateway Interface (CGI) на языке C, [14] [15] [16], которые он использовал для поддержки своей личной домашней страницы . Он расширил их для работы с веб-формами и для связи с базами данных и назвал эту реализацию «Personal Home Page / Forms Interpreter» или PHP / FI.
PHP / FI можно использовать для создания простых динамических веб-приложений . Чтобы ускорить создание отчетов об ошибках и улучшить код, Лердорф первоначально объявил о выпуске PHP / FI как «Инструменты персональной домашней страницы (PHP Tools) версии 1.0» в дискуссионной группе Usenet comp.infosystems.www.authoring.cgi 8 июня 1995 г. . [17] [18] В этом выпуске уже были базовые функциональные возможности PHP. Это включало Perl-подобные переменные , обработку форм и возможность встраивать HTML. Синтаксис напоминал Perl , но был более простым, более ограниченным и менее последовательны. [7]
Пример раннего синтаксиса PHP :
включить / текст / заголовок . html ->GETENV HTTP_USER_AGENT -> если подстрока $ exec_result Mozilla -> Эй , вы которые с помощью Netscape ! < Р > ENDIF ->SQL базы данных выберите * из таблицы , где пользователь = '$ имя пользователя' -> ifless $ NumEntries 1 -> К сожалению , что запись вовсе не существует < р > ENDIF выход -> Добро пожаловать $ пользователю ! -> < р > Вы есть $ индекс : 0 -> кредиты остаются в вашем аккаунте <. р >включить / текст / нижний колонтитул . html ->
Ранний PHP не задумывался как новый язык программирования и рос органически, и Лердорф, оглядываясь назад, заметил: «Я не знаю, как это остановить, никогда не было никакого намерения написать язык программирования [...] У меня есть абсолютно не представляю, как написать язык программирования, я просто продолжал добавлять следующий логический шаг на этом пути ». [19] Команда разработчиков начала формироваться и после нескольких месяцев работы и бета- тестирования официально выпустила PHP / FI 2 в ноябре 1997 года.
Тот факт, что PHP изначально не разрабатывался, а разрабатывался органически, привел к непоследовательному именованию функций и непоследовательному порядку их параметров. [20] В некоторых случаях имена функций выбирались так, чтобы они соответствовали библиотекам нижнего уровня, которые PHP «обертывал», [21] в то время как в некоторых очень ранних версиях PHP длина имен функций использовалась внутри как хеш-функция. , поэтому имена были выбраны для улучшения распределения хеш-значений. [22]
PHP 3 и 4
Зеев Сураски и Энди Гутманс переписали синтаксический анализатор в 1997 году и легли в основу PHP 3, изменив имя языка на рекурсивную аббревиатуру PHP: Hypertext Preprocessor . [7] [23] После этого началось публичное тестирование PHP 3, и официальный запуск состоялся в июне 1998 года. Сураски и Гутманс затем начали новую перезапись ядра PHP, выпустив Zend Engine в 1999 году. [24] Они также основали Zend Технологии в Рамат-Гане , Израиль. [7]
22 мая 2000 года был выпущен PHP 4 на базе Zend Engine 1.0. [7] К августу 2008 г. эта ветка достигла версии 4.4.9. PHP 4 больше не находится в стадии разработки, и никаких обновлений безопасности не будет. [25] [26]
PHP 5
1 июля 2004 года был выпущен PHP 5 на базе нового Zend Engine II. [7] PHP 5 включает новые функции, такие как улучшенная поддержка объектно-ориентированного программирования , расширение PHP Data Objects (PDO) (которое определяет легкий и согласованный интерфейс для доступа к базам данных) и многочисленные улучшения производительности. [27] В 2008 году PHP 5 стал единственной стабильной версией, находящейся в стадии разработки. Поздняя статическая привязка отсутствовала в PHP и была добавлена в версии 5.3. [28] [29]
Многие известные проекты с открытым исходным кодом перестали поддерживать PHP 4 в новом коде с 5 февраля 2008 г. из-за инициативы GoPHP5, [30] предоставленной консорциумом разработчиков PHP, продвигающих переход с PHP 4 на PHP 5. [31] ] [32]
Со временем интерпретаторы PHP стали доступны в большинстве существующих 32-разрядных и 64-разрядных операционных систем, либо путем сборки их из исходного кода PHP, либо с помощью предварительно созданных двоичных файлов. [33] Для PHP версий 5.3 и 5.4 единственными доступными двоичными дистрибутивами Microsoft Windows были 32-разрядные сборки IA-32 , [34] [35] требующие 32-разрядного режима совместимости Windows при использовании Internet Information Services (IIS) на 64 -разрядной версии. -битная платформа Windows. Версия PHP 5.5 сделала 64-битные сборки x86-64 доступными для Microsoft Windows. [36]
Официальная поддержка безопасности PHP 5.6 закончилась 31 декабря 2018 г. [37]
PHP 6 и Юникод
PHP получил неоднозначные отзывы из-за отсутствия поддержки Unicode на уровне ядра языка. [38] [39] В 2005 году был инициирован проект, возглавляемый Андреем Змиевским, по внедрению встроенной поддержки Unicode в PHP путем встраивания библиотеки International Components for Unicode (ICU) и внутреннего представления текстовых строк в формате UTF-16 . [40] Так как это повлечет за собой серьезные изменения как во внутреннем устройстве языка, так и в коде пользователя, планировалось выпустить его как версию 6.0 языка вместе с другими основными функциями, находившимися на тот момент в разработке. [41]
Однако нехватка разработчиков, которые понимали необходимые изменения, и проблемы с производительностью, возникающие при преобразовании в UTF-16 и обратно, который редко используется в веб-контексте, привели к задержкам в реализации проекта. [42] В результате в 2009 году был создан выпуск PHP 5.3, в котором многие функции, не относящиеся к Unicode, были перенесены из PHP 6, особенно пространства имен. В марте 2010 года проект в его нынешнем виде был официально закрыт, и был подготовлен выпуск PHP 5.4, содержащий большинство оставшихся не-Unicode функций из PHP 6, таких как трейты и повторное связывание замыкания. [43] Первоначальные надежды заключались в том, что будет сформирован новый план интеграции Unicode, но к 2014 году так и не был принят.
PHP 7
В течение 2014 и 2015 годов была разработана новая основная версия PHP, которая получила номер PHP 7. Нумерация этой версии вызвала некоторые дискуссии среди внутренних разработчиков. [44] Хотя эксперимент PHP 6 Unicode так и не был выпущен, в нескольких статьях и названиях книг упоминалось имя PHP 6, что могло вызвать путаницу, если бы в новом выпуске это имя использовалось повторно. [45] После голосования было выбрано название PHP 7. [46]
В основе PHP 7 лежит ветвь PHP, которая изначально называлась PHP следующего поколения ( phpng ). Он был написан Дмитрием Стоговым, Ксинчен Хуи и Никитой Поповым [47] и был направлен на оптимизацию производительности PHP за счет рефакторинга Zend Engine при сохранении почти полной языковой совместимости. [48] К 14 июля 2014 года тесты производительности WordPress , которые служили основным набором тестов для проекта phpng, показали почти 100% рост производительности. Изменения от phpng Ожидается также , чтобы сделать его проще для повышения производительности в будущем, так как более компактные структуры данных и другие изменения рассматриваются как лучше подходят для успешного перехода к точно в срок (JIT) компилятор. [49] Из-за значительных изменений переработанный Zend Engine получил название Zend Engine 3 , заменив Zend Engine 2, использованный в PHP 5. [50]
Из-за серьезных внутренних изменений в phpng он должен получить новый основной номер версии PHP, а не второстепенный выпуск PHP 5, в соответствии с процессом выпуска PHP. [51] В основных версиях PHP разрешено нарушать обратную совместимость кода, и поэтому PHP 7 предоставил возможность для других улучшений, помимо phpng, которые требуют нарушений обратной совместимости. В частности, в него были внесены следующие изменения:
- Многие устаревшие механизмы ошибок PHP фатального или исправимого уровня были заменены современными объектно-ориентированными исключениями . [52]
- Синтаксис переменного разыменования был переработан , чтобы быть внутренне последовательными и полным, что позволяет использовать операторы
->
,[]
,()
,{}
, и::
, с произвольными содержательными левосторонними выражениями. [53] - Поддержка устаревших методов конструктора в стиле PHP 4 устарела. [54]
- Поведение foreachзаявления было изменено на более предсказуемое. [55]
- Конструкторы для нескольких классов, встроенных в PHP, которые возвращали null при сбое, были изменены, чтобы вместо этого генерировать исключение для согласованности. [56]
- Несколько необслуживаемых или устаревших интерфейсов программирования серверных приложений (SAPI) и расширений были удалены из ядра PHP, в первую очередь устаревшее
mysql
расширение. [57] - Поведение
list()
оператора было изменено, чтобы удалить поддержку строк. [58] - Была удалена поддержка устаревших разделителей в стиле ASP
<%
и%>
и. [59]
- Исправлена недоработка, позволяющая оператору switch иметь несколько
default
предложений. [60] - Поддержка шестнадцатеричных чисел в некоторых неявных преобразованиях из строк в числовые типы была удалена. [61]
- Операторы сдвига влево и вправо были изменены, чтобы вести себя более согласованно на разных платформах. [62]
- Преобразования между числами с плавающей запятой и целыми числами были изменены (например, бесконечность изменена на преобразование в ноль) и реализованы более последовательно на разных платформах. [62] [63]
PHP 7 также включает новые языковые функции. В частности, он вводит объявления типа возвращаемого значения для функций [64], которые дополняют существующие объявления типа параметра, и поддерживает скалярные типы (целое число, число с плавающей запятой, строка и логическое значение) в объявлениях параметров и возвращаемых типов. [65]
PHP 8
PHP 8 был выпущен 26 ноября 2020 года. PHP 8 является основной версией и имеет существенные изменения по сравнению с предыдущими версиями. [66] [67] Новые функции и заметные изменения:
Своевременная компиляция
Компиляция «точно в срок» поддерживается в PHP 8. [68]
JIT-компилятор PHP 8 может обеспечить существенное улучшение производительности в некоторых случаях использования. [69] [70] PHP-разработчик Никита Попов заявил, что улучшение производительности для большинства веб-сайтов будет менее значительным, чем при обновлении с PHP 5 до PHP 7. [71] Ожидается улучшение производительности за счет добавления JIT-компилятора. более существенен для операций математического типа, чем для обычных случаев использования веб-разработки. [71] Кроме того, JIT-компилятор обеспечивает в будущем возможность переноса некоторого кода с C на PHP из-за улучшения производительности для некоторых случаев использования. [72]
Добавление выражения соответствия
В PHP 8 появилось match
выражение. [73] Выражение соответствия концептуально похоже на switch
оператор и более компактно для некоторых случаев использования. [74] Поскольку match
это выражение, его результат может быть записан в переменную или возвращен функцией. [75]
Изменения и дополнения типов
PHP 8 представил типы объединения, новый static
тип возвращаемого значения и новый mixed
тип. [66]
«Атрибуты», часто называемые «аннотациями» в других языках программирования, были добавлены в PHP 8, что позволяет добавлять метаданные в классы. [66]
throw
был изменен с утверждения на выражение. [76] Это позволяет создавать исключения в местах, которые ранее были невозможны. [66]
Изменения и дополнения синтаксиса
PHP 8 включает изменения, позволяющие использовать альтернативный, более сжатый или более согласованный синтаксис в ряде сценариев. Например, оператор nullsafe похож на оператор объединения null??
, но используется при вызове методов. [77] Следующий фрагмент кода не выдаст ошибку, если getBirthday()
вернет значение null:
$ human_readable_date = $ user -> getBirthday () ? -> diffForHumans ();
Расширение свойств конструктора было добавлено в качестве « синтаксического сахара », позволяющего автоматически устанавливать свойства класса при передаче параметров в конструктор класса . [66] Это сокращает объем написанного шаблонного кода .
Другие незначительные изменения включают поддержку использования ::class
на объектах, которые служат альтернативой использованию get_class()
; [66] уловы без захвата в блоках try-catch; настройки синтаксиса переменных для устранения несоответствий; поддержка именованных аргументов; и поддержка замыкающих запятых в списках параметров, что добавляет единообразие с поддержкой замыкающих запятых в других контекстах, например в массивах.
Изменения и дополнения в стандартной библиотеке
- В PHP 8 были добавлены слабые карты. A
WeakMap
содержит ссылки на объекты, но эти ссылки не препятствуют сборке мусора для таких объектов . [78] Это может обеспечить повышение производительности в сценариях, где данные кэшируются ; это особенно актуально для ORM . [66] - Различные настройки интерфейсов, такие как добавление поддержки для создания
DateTime
объектов из интерфейсов и добавлениеStringable
интерфейса, который можно использовать для подсказки типов. - Различные новые функции, включая str_contains (), str_starts_with () и str_ends_with (); [79] fdiv (); get_debug_type (); и get_resource_id ()
- Объектная реализация token_get_all ()
Дополнительные изменения
- Аннотации типов также были добавлены в исходный код PHP на C, чтобы внутренние функции и методы могли иметь «полную информацию о типе в отражении». [80]
- Наследование частными методами
- Абстрактные методы в улучшении характеристик
История выпуска
Версия | Дата выпуска | Поддерживается до [81] | Заметки |
---|---|---|---|
1.0 | 8 июня 1995 г. | Официально называется «Инструменты персональной домашней страницы (инструменты PHP)». Это первое использование имени «PHP». [7] | |
2.0 | 1 ноября 1997 г. | Официально называется «PHP / FI 2.0». Это первый выпуск, который на самом деле можно охарактеризовать как PHP, поскольку он является автономным языком с множеством функций, которые сохранились до наших дней. | |
3.0 | 6 июня 1998 г. | 20 октября 2000 г. [81] | Разработка переходит от одного человека к нескольким разработчикам. Зеев Сураски и Энди Гутманс переписывают базу для этой версии. [7] |
4.0 | 22 мая 2000 г. [82] | 23 июня 2001 г. [81] | Добавлена более продвинутая двухэтапная система синтаксического анализа / выполнения тегов, называемая движком Zend. [83] |
4.1 | 10 декабря 2001 г. [84] | 12 марта 2002 г. [81] | Внедренные "Суперглобальные" ( $_GET , $_POST , $_SESSION и т.д.) [83] |
4.2 | 22 апреля 2002 г. [85] | 6 сентября 2002 г. [81] | register_globals По умолчанию отключено . Данные, полученные по сети, больше не вставляются непосредственно в глобальное пространство имен, закрывая возможные дыры в безопасности в приложениях. [83] |
4.3 | 27 декабря 2002 г. [86] | 31 марта 2005 г. [81] | Добавлен интерфейс командной строки (CLI) в дополнение к CGI. [83] [87] |
4.4 | 11 июля 2005 г. [88] | 7 августа 2008 г. [81] | Исправлена ошибка повреждения памяти, которая требовала нарушения бинарной совместимости с расширениями, скомпилированными для PHP версии 4.3.x. [89] |
5.0 | 13 июля 2004 г. [90] | 5 сентября 2005 г. [81] | Zend Engine II с новой объектной моделью. [91] |
5.1 | 24 ноября 2005 г. [92] | 24 августа 2006 г. [81] | Улучшения производительности с введением переменных компилятора в переработанный PHP Engine. [91] Добавлены объекты данных PHP (PDO) в качестве согласованного интерфейса для доступа к базам данных. [93] |
5.2 | 2 ноября 2006 г. [94] | 6 января 2011 [81] | Расширение фильтра включено по умолчанию. Встроенная поддержка JSON . [91] |
5,3 | 30 июня 2009 г. [95] | 14 августа 2014 [81] | Поддержка пространства имен ; позднее статическое связывание , прыгать метка (ограниченное Гото ), анонимные функции , замыкания , PHP архивы (Phar), вывоз мусора для циклических ссылок, улучшенная Windows , поддержка, sqlite3, mysqlnd в качестве замены для libmysql как основной библиотеки для расширений , которые работают с MySQL , fileinfo в качестве замены mime_magic для лучшей поддержки MIME , расширения интернационализации и прекращения поддержки расширения ereg. |
5,4 | 1 марта 2012 г. [96] | 3 сентября 2015 г. [81] | Поддержка трейтов, поддержка синтаксиса коротких массивов. Убраны пункты: register_globals , safe_mode , allow_call_time_pass_reference , , и . Встроенный веб-сервер. [97] Несколько улучшений существующих функций, производительности и снижения требований к памяти.session_register() session_unregister() session_is_registered() |
5.5 | 20 июня 2013 [98] | 10 июля 2016 [99] | Поддержка генераторов , finally блоков обработки исключений, OpCache (на основе Zend Optimizer +) в официальном дистрибутиве. [100] |
5,6 | 28 августа 2014 [101] | 31 декабря 2018 [99] | Постоянные скалярные выражения, вариативные функции , распаковка аргументов, новый оператор возведения в степень, расширения use оператора для функций и констант, новый phpdbg отладчик в виде модуля SAPI и другие небольшие улучшения. [102] |
6.x | Не издан | N / A | Заброшенная версия PHP, в которой планировалось включить встроенную поддержку Unicode. [103] [104] |
7.0 | 3 декабря 2015 г. [105] | 10 января 2019 [51] | Zend Engine 3 (улучшения производительности [49] и поддержка 64-битных целых чисел в Windows [106] ), унифицированный синтаксис переменных, [53] процесс компиляции на основе AST , [107] добавлен , [108] согласованность побитового сдвига между платформами, [ 109] ( null coalesce ) оператор, [110] синтаксис экранирования кодовой точки Unicode , [111] объявления возвращаемого типа, [64] объявления скалярных типов (целые, плавающие, строковые и логические), [65] трехстороннее сравнение "космический корабль" оператор, [112] делегирование генератора , [113] анонимные классы , [114] более простой и согласованный API CSPRNG , [115] замена многих оставшихся внутренних «ошибок» PHP на более современные исключения , [52] и сокращенный синтаксис для импорт нескольких элементов из пространства имен. [116]Closure::call() ?? <=> |
7.1 | 1 декабря 2016 г. | 1 декабря 2019 г. [99] | тип возвращаемого значения void , [117] модификаторы видимости констант класса [118] |
7.2 | 30 ноября 2017 г. | 30 ноября 2020 [99] | Параметр объекта и объявление типа возвращаемого значения, [119] расширение Libsodium, [120] переопределение абстрактного метода, [121] расширение типа параметра [122] |
7.3 | 6 декабря 2018 [123] | 6 декабря 2021 г. | Гибкая Heredoc и Nowdoc синтаксиса, [124] поддержка для опорного назначения и массива деконструкции со списком (), [125] поддержка PCRE2, [126] Функция hrtime () [127] |
7,4 | 28 ноября 2019 [128] | 28 ноября 2022 г. | Типизированные свойства 2.0, [129] предварительная загрузка, [130] объединяющий нуль оператор присваивания, [131] улучшение openssl_random_pseudo_bytes, [132] Слабые ссылки, [78] FFI - интерфейс внешней функции , [133] всегда доступное расширение хэша, [134] реестр хэшей паролей, [135] разделение многобайтовых строк, [136] отражение для ссылок, [137] разделение ext / wddx, [138] новый механизм сериализации настраиваемых объектов [139] |
8.0 | 26 ноября 2020 [140] | 26 ноября 2023 г. | Компиляция Just-In-Time (JIT) , [68] массивы, начинающиеся с отрицательного индекса, [141] более строгая / разумная языковая семантика (проверка для абстрактных методов признаков), [142] более разумное сравнение строк с числами, [143] более разумное числовое строки, [144] TypeError при недопустимых арифметических / побитовых операторах, [145] реклассификация различных ошибок механизма, [146] ошибки согласованного типа для внутренних функций, [147] фатальная ошибка для несовместимых сигнатур методов [148] ), не зависящий от локали float преобразование в строку, [149] настройки синтаксиса переменных, [150] атрибутов, [151] [152] [153] [154] именованных аргументов, [155] выражение соответствия, [156] продвижение свойств конструктора, [157] типов объединения, [158] смешанный тип, [159] статический тип возвращаемого значения, [160] оператор nullsafe, [77] не захватывающие уловки, [161] выражение throw, [76] расширение JSON всегда доступно. [162] |
8.1 | ?? Ноябрь 2021 г. | ?? Ноябрь 2024 г. | Явное восьмеричное целочисленное буквальное обозначение, [163] перечисления [164] |
Легенда: Старая версия Старая версия, все еще поддерживается Последняя версия Последняя предварительная версия Будущий выпуск |
Начиная с 28 июня 2011 года, команда разработчиков PHP реализовала график выпуска новых версий PHP. [51] Согласно этой системе, по крайней мере, один выпуск должен происходить каждый месяц. Раз в год должен выпускаться небольшой выпуск, который может включать новые функции. Каждый второстепенный выпуск должен поддерживаться как минимум в течение двух лет с исправлениями безопасности и ошибок, а затем как минимум один год только исправлениями безопасности, в общей сложности трехлетний процесс выпуска каждого второстепенного выпуска. Никакие новые функции, за исключением небольших и автономных, не должны вводиться в второстепенный выпуск в течение трехлетнего процесса выпуска.
Талисман
Талисманом PHP проекта является elePHPant , синий слон с PHP логотип на его стороне, разработанный Винсентом Понтиер [165] в 1998 г. [166] «В (PHP) письма образуя форму слона , если смотреть в боковой угол ". [167] ElePHPant иногда бывает разного цвета в форме плюшевой игрушки .
За прошедшие годы было создано множество вариаций этого талисмана. Только elePHPants, основанные на оригинальном дизайне Винсента Понтье, считаются официальными в сообществе. [168] Это коллекционные предметы, и некоторые из них крайне редки. [169]
Синтаксис
Следующее "Hello, World!" Программа написана на PHP-коде, встроенном в HTML- документ:
PHP "Hello, World!" программа php echo ' Привет, мир!
' ; ?>