PHP


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

Код 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]

Ранняя история

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

Разработка 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

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

Зеев Сураски и Энди Гутманс переписали синтаксический анализатор в 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]
  • Наследование частными методами
  • Абстрактные методы в улучшении характеристик

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

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

ElePHPant, талисман PHP

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

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

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

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

     PHP "Hello, World!" программа     php echo  '

Привет, мир!

'
;
?>