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