PHP

Язык сценариев, созданный в 1994 году.
PHP
ПарадигмаМультипарадигмальный : императивный , функциональный , объектно-ориентированный , процедурный , рефлексивный
РазработаноРасмус Лердорф
РазработчикКоманда разработчиков PHP , Zend Technologies , PHP Foundation
Впервые появился8 июня 1995 г .; 29 лет назад [1] [2] ( 1995-06-08 )
Стабильный релиз
8.3.13 / 24 октября 2024 г. ; 7 дней назад [3] ( 2024-10-24 )
Предварительный релиз
8.4.0 RC 3 / 24 октября 2024 г. ; 7 дней назад [4] ( 2024-10-24 )
Дисциплина набора текстаДинамичный , слабый , постепенный [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 в Wikibooks

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; и Энди Гутманс и Зеев Сураски , создатели Zend Engine

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

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

PHP 3 и 4

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

Зеев Сураски и Энди Гутманс переписали парсер в 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]

PHP5

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 6 и Юникод

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 году ни один из них не был принят. [ необходима цитата ]

PHP7

В 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, которые требуют нарушений обратной совместимости. [ необходима цитата ] В частности, он включал следующие изменения:

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

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

PHP8

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]

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

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

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

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

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

PHP 8.1

PHP 8.1 был выпущен 25 ноября 2021 года. [89] Он добавил поддержку перечислений (также называемых «перечислениями»), объявление свойств как readonly(что предотвращает изменение свойства после инициализации) и распаковку массива со строковыми ключами. Новый тип never может использоваться для указания того, что функция не возвращает значение. [90]

PHP 8.2

PHP 8.2 был выпущен 8 декабря 2022 года. [91] Новым в этом выпуске являются readonlyклассы (свойства экземпляров которых неявно доступны только для чтения), типы дизъюнктивной нормальной формы (DNF) и randomрасширение, которое предоставляет генератор псевдослучайных чисел с объектно-ориентированным API , [92] редактирование значений чувствительных параметров и множество других функций.

История релизов

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

Талисман

ElePHPant, талисман PHP

Талисманом проекта PHP является elePHPant , синий слон с логотипом PHP на боку, разработанный Винсентом Понтье [204] в 1998 году. [205] «Буквы (PHP) образовывали форму слона, если смотреть под углом сбоку». [206] Иногда elePHPant имеет другой цвет, когда находится в форме плюшевой игрушки . [207]

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

Синтаксис

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

Следующая программа «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-объекты

Базовая функциональность объектно-ориентированного программирования была добавлена ​​в 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] Объекты одного типа имеют доступ к закрытым и защищенным членам друг друга, даже если они не являются одним и тем же экземпляром. [ необходима цитата ] publicprivateprotectedvarpublicpublicprotectedprivate

Пример

Ниже приведен базовый пример объектно-ориентированного программирования в 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. [ необходима цитата ] Альтернативные реализации включают следующее:

  • HHVM (виртуальная машина HipHop) — разработанная в Facebook и доступная с открытым исходным кодом, она преобразует PHP-код в высокоуровневый байт-код (обычно известный как промежуточный язык ), который затем динамически транслируется в машинный код x86-64 во время выполнения с помощью компилятора just-in-time (JIT), что приводит к повышению производительности до 6 раз. [239] Однако, начиная с версии 7.2, Zend превзошла HHVM, [240] а HHVM 3.24 — последняя версия, официально поддерживающая PHP. [241]
    • HipHop  – разработан в Facebook и доступен как открытый исходный код, он преобразует PHP-скрипты в код C++ , а затем компилирует полученный код, снижая нагрузку на сервер до 50%. В начале 2013 года Facebook отказался от него в пользу HHVM по нескольким причинам, включая трудности развертывания и отсутствие поддержки всего языка PHP, включая конструкции create_function()и eval(). [242]
  • Parrot  — виртуальная машина, предназначенная для эффективного запуска динамических языков; кросс-транслятор Pipp преобразует исходный код PHP в промежуточное представление Parrot , которое затем транслируется в байт-код Parrot и выполняется виртуальной машиной.
  • PeachPie – компилятор второго поколения для байт-кода . NET Common Intermediate Language (CIL), созданный на платформе Roslyn ; преемник Phalanger, использующий несколько общих архитектурных компонентов
  • Phalanger  – компилирует PHP в байт-код .Net Common Intermediate Language; предшественник PeachPie
  • Quercus  – компилирует PHP в байт-код Java

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

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.

Фонд PHP

PHP
Формирование22 ноября 2021 г. ; 2 года назад ( 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]6832838
2023 [261]78470217

Фонд нанимает «Core Developers» для работы над основным репозиторием языка PHP. Роман Пронский, член правления фонда, сказал, что они стремятся платить «рыночные зарплаты» разработчикам. [262]

Реакция на фонд в основном была положительной, фонд хвалили за лучшую поддержку языка и помощь в остановке падения его популярности. [263] [264] Однако его также критиковали за внесение критических изменений в младшие версии PHP, например, в PHP 8.2, где инициализация членов класса вне исходной области действия класса приводила к ошибкам амортизации. [265] Эти изменения повлияли на ряд проектов с открытым исходным кодом, включая WordPress . [266]

Немецкий государственный технологический фонд выделил более 200 000 евро на поддержку PHP Foundation. [267]

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

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

Существует два основных способа добавления поддержки 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]

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

Широкий обзор программного пакета LAMP, представленного здесь вместе со Squid

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

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

Первоначально разработанный для создания динамических веб-страниц , 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]

8 филиппинских песо
35,3%
PHP 7
51%
5 филиппинских песо
13,5%
PHP 4
0,1%






Доля использования версий PHP на 23 сентября 2024 г.:
десять месяцев после выпуска PHP 8.3 [20] [308] [309] [310] [311]

  PHP 8.3: 7,70% от PHP 8 (2,72%)
  PHP 8.2: 22,6% от PHP 8 (7,98%)
  PHP 8.1: 42,0% от PHP 8 (14,83%)
  PHP 8.0: 27,7% от PHP 8 (9,78%)
  PHP 7.4: 71,7% от PHP 7 (36,57%)
  PHP 7.3: 11,9% от PHP 7 (6,07%)
  PHP 7.2: 8,80% от PHP 7 (4,49%)
  PHP 7.1: 3,80% от PHP 7 (1,94%)
  PHP 7.0: 3,90% от PHP 7 (1,99%)
  PHP 5.6: 54,2% от PHP 5 (7,3170%)
  PHP 5.5: 8,20% от PHP 5 (1,1070%)
  PHP 5.4: 15,5% от PHP 5 (2,0925%)
  PHP 5.3: 14,7% от PHP 5 (1,9845%)
  PHP 5.2: 6,80% от PHP 5 (0,9180%)
  PHP 5.1: 0,40% от PHP 5 (0,0540%)
  PHP 5.0: 0,10% от PHP 5 (0,0135%)
  PHP 4.4: 76,4% от PHP 4 (0,0764%)
  PHP 4.3: 19,0% от PHP 4 (0,0190%)
  PHP 4.2: 3,30% от PHP 4 (0,0033%)
  PHP 4.1: 0,90% от PHP 4 (0,0009%)
  PHP 4.0: 0,40% от PHP 4 (0,0004%)

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

В 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]

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

Ссылки

  1. ^ ab Lerdorf, Rasmus (8 июня 1995 г.). "Анонс: Персональные инструменты домашней страницы (PHP-инструменты)" . Получено 7 июня 2011 г.
  2. ^ ab Lerdorf, Rasmus (2007-04-26). "PHP on Hormones – история PHP, презентация Расмуса Лердорфа, представленная на конференции MySQL в Санта-Кларе, Калифорния". The Conversations Network. Архивировано из оригинала 2013-07-29.
  3. ^ "PHP: Архив новостей – 2024". www.php.net .
  4. ^ "PHP: Архив новостей – 2024". www.php.net .
  5. ^ "PHP: Аргументы функций – Руководство". secure.php.net .
  6. ^ "PHP: Архивы релизов (музей)". museum.php.net .
  7. ^ "PHP: Предисловие – Руководство".
  8. ^ Стогов, Дмитрий [@dstogov] (2015-12-04). «Не секрет, что некоторые идеи оптимизации #PHP7 пришли из HHVM, LuaJIT и V8. Спасибо @HipHopVM @SaraMG. #php7thankyou» ( Твит ) – через Twitter .
  9. ^ "PHP: Препроцессор гипертекста". www.php.net . Получено 2020-02-12 .
  10. ^ ab Krill, Paul (18.11.2013). «Верьте шумихе: основатель PHP поддерживает технологию HipHop от Facebook». InfoWorld . Получено 13.10.2022 .
  11. ^ "Анонс: Персональные инструменты домашней страницы (PHP-инструменты)". groups.google.com . Получено 2022-11-03 .
  12. ^ abcdefghi "История PHP и связанных проектов". PHP Group . Получено 2008-02-25 .
  13. ^ ab "История PHP". php.net .
  14. ^ Олссон, Микаэль (2013-09-04). PHP Quick Scripting Reference. Apress. ISBN 978-1-4302-6284-8.
  15. ^ Руководство по PHP: Предисловие, www.php.net.
  16. ^ "Введение: Что может PHP?". Руководство по PHP . Получено 2009-03-05 .
  17. ^ helicopter: Порт node-ar-drone, который позволяет пользователю управлять Parrot AR Drone через PHP: jolicode/php-ar-drone, JoliCode, 2019-01-11 , получено 2019-02-23
  18. ^ ab "Внедрение PHP в HTML". O'Reilly. 2001-05-03. Архивировано из оригинала 2008-02-19 . Получено 2008-02-25 .
  19. ^ "PHP: Неподдерживаемые ветки". www.php.net .
  20. ^ abc "Статистика использования PHP для веб-сайтов". W3Techs – World Wide Web Technology Surveys . W3Techs . Получено 27 октября 2024 г. .
  21. ^ Лердорф, Расмус (2012-07-20). "Интересно, почему люди продолжают писать, что PHP когда-то был написан на Perl. Он никогда не был написан. #php". Twitter . Получено 2014-09-04 .
  22. ^ Лердорф, Расмус (2007-04-26). "PHP о гормонах". The Conversations Network. Архивировано из оригинала (mp3) 2019-01-06 . Получено 2009-06-22 .
  23. ^ Лердорф, Расмус (2007). "Слайд 3". слайды для доклада "PHP о гормонах" . PHP Group . Получено 22.06.2009 .
  24. ^ Лердорф, Расмус (1995-06-08). "Анонс: Персональные инструменты домашней страницы (PHP-инструменты)". Группа новостей : comp.infosystems.www.authoring.cgi . Получено 2006-09-17 .
  25. ^ "Расмус Лердорф, старший технический специалист Yahoo: PHP, за микрофоном". 2003-11-19. Архивировано из оригинала 2013-07-28.
  26. ^ Alshetwi, AB; Rahmat, RAAO; Borhan, MN; Ismael, S.; Ali, A.; Irtema, HIM; Alfakhria, AY (2018). "Экспертная веб-система для оптимизации дорожного движения в развивающихся странах" . Получено 13 февраля 2024 г.
  27. ^ "Проблемы с PHP" . Получено 20 декабря 2010 г.
  28. ^ "php.internals: Re: Согласованность имен функций". news.php.net . 2013-12-28 . Получено 2014-02-09 .
  29. ^ Расмус Лердорф (16 декабря 2013 г.). "Re: Гибкое именование функций". Группа новостей : php.internals . Получено 26 декабря 2013 г.
  30. ^ "PHP – Акроним Значение Голосование". PHP.net . Архивировано из оригинала 15 августа 2000 года.
  31. ^ "Zend Engine версии 2.0: Обзор функций и дизайн". Zend Technologies Ltd. Архивировано из оригинала 2006-07-19 . Получено 2006-09-17 .
  32. ^ "Архив новостей php.net 2007". PHP Group. 2007-07-13 . Получено 2008-02-22 .
  33. ^ Кернер, Шон Майкл (2008-02-01). "PHP 4 мертв — да здравствует PHP 5". InternetNews. Архивировано из оригинала 2018-08-06 . Получено 2018-12-16 .
  34. ^ Трахтенберг, Адам (2004-07-15). "Почему PHP 5 Rocks!". O'Reilly. Архивировано из оригинала 2016-03-31 . Получено 2008-02-22 .
  35. ^ "Позднее статическое связывание в PHP". Digital Sandwich. 2006-02-23 . Получено 2008-03-25 .
  36. ^ "Статическое ключевое слово". PHP Group . Получено 2008-03-25 .
  37. ^ "GoPHP5". Архивировано из оригинала 2011-07-17.
  38. ^ "PHP projects join forces to Go PHP 5" (PDF) . Пресс-релиз GoPHP5 . Архивировано из оригинала (PDF) 2019-08-04 . Получено 2008-02-23 .
  39. ^ "GoPHP5". GoPHP5. Архивировано из оригинала 2011-04-27 . Получено 2008-02-22 .
  40. ^ "Установка и настройка PHP". php.net . Получено 29.10.2013 .
  41. ^ "PHP для Windows: Выпуски двоичных файлов и исходников (5.3)". php.net . Получено 29.10.2013 .
  42. ^ "PHP для Windows: Выпуски двоичных файлов и исходников (5.4)". php.net . Получено 29.10.2013 .
  43. ^ "PHP для Windows: Выпуски двоичных файлов и исходников (5.5)". php.net . Получено 29.10.2013 .
  44. ^ «PHP: Поддерживаемые версии».
  45. ^ "Типы: Строки (Руководство по PHP)". PHP.net . Получено 2013-09-22 .
  46. ^ "Подробности типа String (Руководство по PHP)". PHP.net . Получено 2021-09-22 .
  47. ^ Андрей Змиевский (2005-08-10). "Документ по проектированию поддержки PHP Unicode" (список рассылки) . Получено 2014-02-09 .
  48. ^ "PHP 5.5 или 6.0" . Получено 2014-02-09 .
  49. ^ Андрей Змиевский (2011-04-22). "Хорошее, плохое и злое: что случилось с Unicode и PHP 6" . Получено 2014-02-09 .
  50. ^ Расмус Лердорф (2010-03-11). "PHP 6" (список рассылки) . Получено 2014-02-07 .
  51. ^ "Бесконечные дебаты Маппетов о PHP 6 и PHP 7". Архивировано из оригинала 2015-11-19 . Получено 2015-11-19 .
  52. ^ "RFC: Название следующей версии PHP". php.net . 2014-07-07 . Получено 2014-07-15 .
  53. ^ "Re: [PHP-DEV] [VOTE] [RFC] Название следующего релиза PHP (снова)". 2014-07-30 . Получено 2014-07-30 .
  54. ^ "phpng: реорганизованный движок PHP с большим улучшением производительности". news.php.net .
  55. ^ "PHP: rfc:phpng". php.net . Получено 16 декабря 2014 г. .
  56. ^ ab "PHP: phpng". php.net . Получено 2014-07-15 .
  57. ^ «Объединить ветку ZendEngine3» . github.com . 05.12.2014 . Проверено 5 декабря 2014 г.
  58. ^ abc "PHP: Процесс выпуска". 2011-06-20 . Получено 2013-10-06 .
  59. ^ ab "PHP RFC: Исключения в движке (для PHP 7)". php.net . Получено 2015-05-21 .
  60. ^ ab "PHP RFC: Единый синтаксис переменных". php.net . 2014-05-31 . Получено 2014-07-30 .
  61. ^ "Онлайн-редактор PHP | вывод для udRhX". 3v4l.org .
  62. ^ "PHP RFC: Исправление поведения "foreach"". php.net . Получено 21.05.2015 .
  63. ^ "PHP RFC: Поведение конструктора внутренних классов". php.net . Получено 21.05.2015 .
  64. ^ "PHP RFC: Удаление мертвых или еще не портированных на PHP7 SAPI и расширений". php.net . Получено 21.05.2015 .
  65. ^ "PHP RFC: Исправление несоответствия поведения list()". php.net . Получено 21.05.2015 .
  66. ^ "PHP RFC: Удалить альтернативные теги PHP". php.net . Получено 2015-05-21 .
  67. ^ "PHP RFC: Сделать определение нескольких случаев по умолчанию в переключателе синтаксической ошибкой". php.net . Получено 21.05.2015 .
  68. ^ "PHP RFC: Удалить поддержку шестнадцатеричных чисел в числовых строках". php.net . Получено 21.05.2015 .
  69. ^ ab "PHP RFC: Integer Semantics". php.net . Получено 2015-05-21 . Заставить NaN и Infinity всегда становиться нулевыми при приведении к целому числу означает большую кросс-платформенную согласованность, а также менее удивительно, чем то, что происходит в настоящее время
  70. ^ "PHP RFC: Ошибка ZPP при переполнении". php.net . Получено 2015-05-21 .
  71. ^ abc "RFC: Типы возвращаемых данных". php.net . 2015-01-27 . Получено 2015-01-28 .
  72. ^ abcdef "RFC: Scalar Type Declarations". php.net . 2015-03-16 . Получено 2015-03-17 .
  73. ^ abcdefghijkl Брент. "Что нового в PHP 8". Stitcher . Получено 22 сентября 2020 г.
  74. ^ ab "PHP 8 Released". PHP . Получено 27 ноября 2020 г. .
  75. ^ ab "PHP: rfc:jit". wiki.php.net . Получено 2019-04-05 .
  76. ^ Брент. "PHP 8: производительность JIT в реальных веб-приложениях". Stitcher.io . Получено 4 октября 2020 г. .
  77. ^ Ретамс, Дерик. «PHP 8: Краткий взгляд на JIT».
  78. ^ ab Попов, Никита (13 июля 2020 г.). ""Что нового в PHP 8.0?" Никита Попов". PHP fwdays. Архивировано из оригинала 2021-12-11 . Получено 4 октября 2020 г.
  79. ^ Даниэль, Карло (25 мая 2020 г.). «Что нового в PHP 8 (функции, улучшения и JIT-компилятор)». Kinsta . Получено 24 декабря 2020 г. .
  80. ^ Редмонд, Пол (15 июля 2020 г.). «Match Expression is Coming to PHP 8». Новости Laravel . Получено 4 октября 2020 г.
  81. ^ "PHP 8.0: Match Expressions". PHP Watch . Получено 4 октября 2020 г.
  82. ^ Барнс, Эрик (27 ноября 2020 г.). «PHP 8 уже выпущен!». Новости Laravel . Получено 24 декабря 2020 г.
  83. ^ ab "PHP RFC: throw expression". wiki.php.net . Получено 14 августа 2020 г. .
  84. ^ ab "PHP RFC: Nullsafe оператор". wiki.php.net . Получено 14 августа 2020 г. .
  85. ^ Руз, Брент. "PHP 8: Продвижение собственности конструктора" . Получено 30 апреля 2024 г.
  86. ^ ab "PHP: rfc:weakrefs". wiki.php.net . Получено 2019-04-05 .
  87. ^ Merchant, Amit (13 июня 2020 г.). «Эти новые строковые функции появятся в PHP 8». Amit Merchant . Получено 4 октября 2020 г. .
  88. ^ Попов, Никита. "Призыв к участию: Аннотирование внутреннего аргумента функции и возвращаемых типов". Внешние данные . Получено 19 ноября 2020 г. .
  89. ^ "PHP 8 ChangeLog". PHP.net . Получено 2024-01-05 .
  90. ^ "PHP: Анонс выпуска PHP 8.1.0". PHP.net . Получено 2024-01-05 .
  91. ^ "PHP 8 ChangeLog". PHP.net . Получено 2024-01-05 .
  92. ^ "PHP: Анонс выпуска PHP 8.2.0". PHP.net . Получено 2024-01-05 .
  93. ^ abcdefghijkl "Неподдерживаемые ветви". php.net . Получено 2019-07-31 .
  94. ^ "PHP 4.0.0 Released" . Получено 25 октября 2020 г. .
  95. ^ abcd "PHP: PHP 4 ChangeLog". PHP Group. 2008-01-03 . Получено 2008-02-22 .
  96. ^ "Объявление о выпуске PHP 4.1.0" . Получено 25 октября 2020 г. .
  97. ^ "Объявление о выпуске PHP 4.2.0" . Получено 25 октября 2020 г. .
  98. ^ "Объявление о выпуске PHP 4.3.0" . Получено 25 октября 2020 г. .
  99. ^ "Использование PHP из командной строки". PHP Manual . PHP Group . Получено 2009-09-11 .
  100. ^ "Объявление о выпуске PHP 4.4.0" . Получено 25 октября 2020 г. .
  101. ^ "Анонс выпуска PHP 4.4.0". PHP Manual . PHP Group . Получено 2013-11-24 .
  102. ^ "PHP 5.0.0 Released!" . Получено 25 октября 2020 г. .
  103. ^ abc "PHP: PHP 5 ChangeLog". PHP Group. 2007-11-08 . Получено 2008-02-22 .
  104. ^ "Объявление о выпуске PHP 5.1.0" . Получено 25 октября 2020 г. .
  105. ^ "Руководство по PHP: PDO". PHP Group. 2011-11-15 . Получено 2011-11-15 .
  106. ^ "Объявление о выпуске PHP 5.2.0" . Получено 25 октября 2020 г. .
  107. ^ "Объявление о выпуске PHP 5.3.0" . Получено 25 октября 2020 г. .
  108. ^ "Объявление о выпуске PHP 5.4.0" . Получено 25 октября 2020 г. .
  109. ^ "Встроенный веб-сервер" . Получено 26 марта 2012 г.
  110. ^ "Объявление о выпуске PHP 5.5.0" . Получено 25 октября 2020 г. .
  111. ^ abcd "Поддерживаемые версии". php.net . Получено 2017-12-13 .
  112. ^ "Изменения PHP 5.5.0". php.net . Получено 2015-03-03 .
  113. ^ "Объявление о выпуске PHP 5.6.0" . Получено 25 октября 2020 г. .
  114. ^ "Переход с PHP 5.5.x на PHP 5.6.x". php.net . Получено 2014-03-24 .
  115. ^ "Сброс PHP 6". На полках были книги, якобы охватывающие PHP 6, по крайней мере с 2008 года. Но в марте 2010 года релиз PHP 6 еще не вышел – на самом деле, он даже близко не вышел. Последние события говорят о том, что PHP 6 не выйдет до 2011 года – если он вообще выйдет.
  116. ^ "PHP 7 движется вперед полным ходом". 2014-10-31. Последние версии PHP были частью серии релизов 5.x, но PHP 6 не будет. "Мы собираемся пропустить [версию] 6, потому что много лет назад у нас были планы на 6, но эти планы сильно отличались от того, что мы делаем сейчас", - сказал Гутманс. Переход сразу к версии 7 позволяет избежать путаницы.
  117. ^ "Архив новостей – 2018: Выпущен PHP 7.2.9". php.net . 2018-08-16 . Получено 2018-08-16 .
  118. ^ "PHP: rfc:size_t_and_int64_next". php.net . Получено 16 декабря 2014 г. .
  119. ^ "PHP: rfc:abstract_syntax_tree". php.net . Получено 16 декабря 2014 г. .
  120. ^ "PHP: rfc:closure_apply". php.net . Получено 16 декабря 2014 г. .
  121. ^ "PHP: rfc:integer_semantics". php.net . Получено 16 декабря 2014 г. .
  122. ^ "PHP: rfc:isset_ternary". php.net . Получено 16 декабря 2014 г. .
  123. ^ "RFC: Синтаксис экранирования кодовых точек Unicode". 2014-11-24 . Получено 2014-12-19 .
  124. ^ "Оператор комбинированного сравнения (космический корабль)". php.net . Получено 2015-05-21 .
  125. ^ "PHP RFC: Делегирование генератора". php.net . Получено 21.05.2015 .
  126. ^ "PHP RFC: Анонимные классы". php.net . Получено 2015-05-21 .
  127. ^ "PHP RFC: Easy User-land CSPRNG". php.net . Получено 21.05.2015 .
  128. ^ "PHP RFC: Объявления группового использования". php.net . Получено 21.05.2015 .
  129. ^ "PHP: rfc:iterable". php.net . 2016-06-10 . Получено 2023-06-30 .
  130. ^ "PHP: rfc:nullable_types". php.net . 2014-04-10 . Получено 2023-06-30 .
  131. ^ "PHP: rfc:void_return_type". php.net . 2015-11-09 . Получено 2015-11-14 .
  132. ^ "PHP: rfc:class_constant_visibility". php.net . 2015-10-27 . Получено 2015-12-08 .
  133. ^ "PHP: rfc:short_list_syntax". php.net . 2016-04-07 . Получено 2023-06-30 .
  134. ^ "PHP: rfc:multiple-catch". php.net . 2016-03-06 . Получено 2023-06-30 .
  135. ^ "PHP: rfc:object-typehint". wiki.php.net .
  136. ^ "PHP: rfc:libsodium". wiki.php.net .
  137. ^ "PHP: rfc:allow-abstract-function-override". wiki.php.net .
  138. ^ "PHP: rfc:parameter-no-type-variance". wiki.php.net .
  139. ^ "PHP: todo:php73". wiki.php.net .
  140. ^ "PHP: rfc:flexible_heredoc_nowdoc_syntaxes". wiki.php.net .
  141. ^ "PHP: rfc:list_reference_assignment". wiki.php.net .
  142. ^ "PHP: rfc:pcre2-migration". wiki.php.net .
  143. ^ "PHP: hrtime – Руководство". php.net .
  144. ^ "PHP 7.4.0 Released!". php.net . Получено 28.11.2019 .
  145. ^ "PHP: rfc:typed_properties_v2". wiki.php.net . Получено 2019-04-04 .
  146. ^ "PHP: rfc:preload". wiki.php.net . Получено 2019-04-04 .
  147. ^ "PHP: rfc:null_coalesce_equal_operator". wiki.php.net . Получено 2019-04-04 .
  148. ^ "PHP: rfc:improve-openssl-random-pseudo-bytes". wiki.php.net . Получено 2019-04-04 .
  149. ^ "PHP: rfc:ffi". wiki.php.net . Получено 2019-04-05 .
  150. ^ "PHP: rfc:permanent_hash_ext". wiki.php.net . Получено 2019-04-05 .
  151. ^ "PHP: rfc:password_registry". wiki.php.net . Получено 2019-04-05 .
  152. ^ "PHP: rfc:mb_str_split". wiki.php.net . Получено 2019-04-05 .
  153. ^ "PHP: rfc:reference_reflection". wiki.php.net . Получено 2019-04-05 .
  154. ^ "PHP: rfc:deprecate-and-remove-ext-wddx". wiki.php.net . Получено 2019-04-05 .
  155. ^ "PHP: rfc:custom_object_serialization". wiki.php.net . Получено 2019-04-05 .
  156. ^ "PHP: Поддерживаемые версии". php.net . Получено 2023-11-26 .
  157. ^ "PHP: rfc:negative_array_index". wiki.php.net . Получено 2019-04-05 .
  158. ^ "PHP RFC: Проверка абстрактных методов признаков". wiki.php.net . Получено 14 августа 2020 г. .
  159. ^ "PHP RFC: Более разумное сравнение строк с числами". wiki.php.net . Получено 14 августа 2020 г. .
  160. ^ "PHP RFC: более разумные числовые строки". wiki.php.net . Получено 14 августа 2020 г. .
  161. ^ "PHP RFC: Более строгие проверки типов для арифметических/побитовых операторов". wiki.php.net . Получено 14 августа 2020 г. .
  162. ^ "PHP RFC: Реклассификация предупреждений двигателя". wiki.php.net . Получено 14 августа 2020 г. .
  163. ^ "PHP: rfc:consistent_type_errors". wiki.php.net . Получено 2019-04-05 .
  164. ^ "PHP: rfc:lsp_errors". wiki.php.net . Получено 2019-05-26 .
  165. ^ "PHP RFC: Приведение числа с плавающей точкой к строке, не зависящее от локали". wiki.php.net . Получено 14 августа 2020 г. .
  166. ^ "PHP RFC: Настройки синтаксиса переменных". wiki.php.net . Получено 14 августа 2020 г. .
  167. ^ "PHP RFC: Атрибуты V2". wiki.php.net . Получено 14 августа 2020 г. .
  168. ^ "PHP RFC: Поправки к атрибутам". wiki.php.net . Получено 14 августа 2020 г. .
  169. ^ "PHP RFC: Сокращенный синтаксис атрибутов". wiki.php.net . Получено 20.06.2020 .
  170. ^ "PHP RFC: Изменение синтаксиса сокращенных атрибутов". wiki.php.net . Получено 14 августа 2020 г. .
  171. ^ "PHP RFC: Именованные аргументы". wiki.php.net . Получено 14 августа 2020 г. .
  172. ^ "PHP RFC: Match expression v2". wiki.php.net . Получено 14 августа 2020 г. .
  173. ^ "PHP RFC: Constructor Property Promotion". wiki.php.net . Получено 14 августа 2020 г. .
  174. ^ "PHP RFC: Union Types 2.0". wiki.php.net . Получено 14 августа 2020 г. .
  175. ^ "PHP RFC: Mixed Type v2". wiki.php.net . Получено 14 августа 2020 г. .
  176. ^ "PHP RFC: Статический возвращаемый тип". wiki.php.net . Получено 14 августа 2020 г. .
  177. ^ "PHP RFC: неперехватывающие перехваты". wiki.php.net . Получено 14 августа 2020 г. .
  178. ^ Андре, Тайсон. "PHP RFC: Всегда доступное расширение JSON". PHP . Получено 25 октября 2020 г. .
  179. ^ "PHP: todo:php81". wiki.php.net . Проверено 16 июня 2022 г.
  180. ^ "PHP RFC: Явная нотация восьмеричного целого числа". wiki.php.net . Получено 25.11.2020 .
  181. ^ "PHP RFC: Перечисления". wiki.php.net . Получено 2021-03-25 .
  182. ^ "PHP: rfc:readonly_properties_v2". wiki.php.net . Получено 2021-11-26 .
  183. ^ "PHP: rfc:first_class_callable_syntax". wiki.php.net . Получено 2021-11-26 .
  184. ^ "PHP: rfc:new_in_initializers". wiki.php.net . Получено 2021-11-26 .
  185. ^ "PHP: rfc:pure-intersection-types". wiki.php.net . Получено 2021-11-26 .
  186. ^ "PHP: rfc:noreturn_type". wiki.php.net . Получено 2021-11-26 .
  187. ^ "PHP: rfc:final_class_const". wiki.php.net . Получено 2021-11-26 .
  188. ^ "PHP: rfc:fibers". wiki.php.net . Получено 2021-11-26 .
  189. ^ "PHP: todo:php82". wiki.php.net . Получено 2022-06-16 .
  190. ^ "PHP: rfc:readonly_classes". wiki.php.net . Получено 2022-06-16 .
  191. ^ "PHP: rfc:null-false-standalone-types". wiki.php.net . Получено 2022-06-16 .
  192. ^ "PHP: rfc:true-type". wiki.php.net . Получено 2022-06-16 .
  193. ^ "PHP: rfc:strtolower-ascii". wiki.php.net . Получено 2022-06-16 .
  194. ^ "PHP: rfc:dnf_types". wiki.php.net . Получено 2023-02-07 .
  195. ^ "PHP: rfc:constants_in_traits". wiki.php.net . Получено 2023-02-07 .
  196. ^ "PHP 8.3.0 Released!". php.net . 23 ноября 2023 г. Получено 24 ноября 2023 г.
  197. ^ "PHP: rfc:typed_class_constants". wiki.php.net . Получено 2023-12-17 .
  198. ^ "PHP: rfc:dynamic_class_constant_fetch". wiki.php.net . Получено 2023-12-17 .
  199. ^ "PHP: rfc:marking_overriden_methods". wiki.php.net . Получено 2023-12-17 .
  200. ^ "PHP: rfc:readonly_amendments". wiki.php.net . Получено 2023-12-17 .
  201. ^ "PHP: rfc:json_validate". wiki.php.net . Получено 2023-12-17 .
  202. ^ "PHP: rfc:randomizer_additions". wiki.php.net . Получено 2023-12-17 .
  203. ^ "PHP: todo: php84". php.net . 26 марта 2024 г. . Получено 26 марта 2024 г. .
  204. ^ "PHP: ElePHPant". 4 октября 2014 г. Получено 4 октября 2014 г.
  205. ^ "Перенаправление…". wwphp-fb.github.io .
  206. ^ «Рождение талисмана PHP – Создатель elePHPant Винсент Понтье раскрывает правдивую историю!». 7php.com . 2014-01-06.
  207. ^ "ElePHPant". PHP.earth . Получено 2024-02-13 .
  208. ^ "PHP: ElePHPant". www.php.net .
  209. ^ «Полевой справочник по слонам». afieldguidetoelephpants.net .
  210. ^ "теги – Руководство". php.net . Получено 2014-02-17 .
  211. ^ ab "PHP: rfc:shortags". php.net . 2008-04-03 . Получено 2014-05-08 .
  212. ^ "PHP: Базовый синтаксис". PHP Group . Получено 2008-02-22 .
  213. ^ "Basic Coding Standard". PHP Framework Interoperability Group . Получено 2016-01-03 .
  214. ^ "echo – Руководство". php.net . Получено 2014-02-17 .
  215. ^ "Описание основных директив php.ini – Руководство". php.net . 2002-03-17 . Получено 2014-02-17 .
  216. ^ "Ваша первая страница с поддержкой PHP". PHP Group . Получено 2008-02-25 .
  217. ^ Брей, Тим и др. (26 ноября 2008 г.). «Инструкции по обработке». Extensible Markup Language (XML) 1.0 (пятое издание) . W3C . Получено 18 июня 2009 г.
  218. ^ "Переменные". PHP Group . Получено 2008-03-16 .
  219. ^ "Разделение инструкций". PHP Group . Получено 2008-03-16 .
  220. ^ "Комментарии". PHP Group . Получено 2008-03-16 .
  221. ^ "Целые числа в PHP, запуск с ножницами и переносимость". Блог производительности MySQL. 27 марта 2007 г. Получено 28.03.2007 .
  222. ^ abcde "Типы". PHP Group . Получено 2008-03-16 .
  223. ^ "Строки". PHP Group . Получено 2008-03-21 .
  224. ^ "SPL – StandardPHPLibrary". PHP.net . 16 марта 2009 г. Получено 16 марта 2009 г.
  225. ^ ab "Пользовательские функции (руководство по PHP)". php.net . 2014-07-04 . Получено 2014-07-07 .
  226. ^ ab "Переменные функции (руководство по PHP)". php.net . 2014-07-04 . Получено 2014-07-07 .
  227. ^ "create_function() (руководство по PHP)". php.net . 2022-04-06 . Получено 2022-05-04 .
  228. ^ "Анонимные функции (руководство по PHP)". php.net . 2014-07-04 . Получено 2014-07-07 .
  229. ^ "Стрелочные функции (руководство по PHP)". php.net . Получено 2021-01-25 .
  230. ^ Кристиан Сейлер; Дмитрий Стогов (2008-07-01). "Запрос комментариев: Лямбда-функции и замыкания". php.net . Получено 2014-07-07 .
  231. ^ ab "Ссылки на объекты PHP 5". mjtsai.com . Получено 2008-03-16 .
  232. ^ "Классы и объекты (PHP 5)". PHP Group . Получено 2008-03-16 .
  233. ^ "Клонирование объектов". PHP Group . Получено 2008-03-16 .
  234. ^ "Видимость (Руководство по PHP)". theserverpages.com . 2005-05-19. Архивировано из оригинала 2010-09-24 . Получено 2010-08-26 .
  235. ^ "Как работают компьютерные языки?". Архивировано из оригинала 2011-07-16 . Получено 2009-11-04 .
  236. ^ Гилмор, У. Джейсон (2006-01-23). ​​Начало PHP и MySQL 5: От новичка к профессионалу. Apress. стр. 43. ISBN 1-59059-552-1.
  237. ^ "[VOTE] Интеграция Zend Optimizer+ в дистрибутив PHP". news.php.net . Получено 2013-03-08 .
  238. ^ "Альтернативный PHP-кэш". PHP.net . Архивировано из оригинала 2013-11-15 . Получено 2013-09-21 .
  239. ^ "Мы — 98,5% (и 16%) «виртуальная машина хип-хопа". hhvm.com . Декабрь 2013. Получено 23.02.2014 .
  240. ^ "Окончательные тесты PHP 5.6, 7.0, 7.1, 7.2 и 7.3 (2019)". 2019-01-14 . Получено 2019-04-19 .
  241. ^ Крилл, Пол (2017-09-20). «Забудьте о PHP! Движок HHVM от Facebook переключается на Hack». InfoWorld . Получено 06.02.2019 .
  242. ^ "Объявление на GitHub об удалении поддержки HPHPc". GitHub . Получено 24.05.2013 .
  243. ^ "Лицензия PHP, версия 3.01" . Получено 20.05.2010 .
  244. ^ "GPL-несовместимые, лицензии свободного ПО". Различные лицензии и комментарии о них . Free Software Foundation . Получено 2011-01-03 .
  245. ^ "PHP: Список функций и методов – Руководство". PHP Group . Получено 2015-01-14 .
  246. ^ "Введение – Руководство". php.net . 2013-06-07 . Получено 2013-06-13 .
  247. Darryl Patterson (5 августа 2004 г.). «Упростите бизнес-логику с помощью PHP DataObjects — O'Reilly Media». ibm.com . Архивировано из оригинала 16 декабря 2014 г. . Получено 16 декабря 2014 г. .
  248. ^ "IBM — Соединенные Штаты" . Получено 16 декабря 2014 г.
  249. ^ "Пять распространенных проблем с базами данных PHP". ibm.com . 2006-08-01 . Получено 2013-06-13 .
  250. ^ "IBM Redbooks — Разработка приложений PHP для серверов данных IBM". redbooks.ibm.com . Получено 16 декабря 2014 г. .
  251. ^ "php[architect] Magazine – Журнал для программистов PHP". www.phparch.com .
  252. ^ Крилл, Пол (19 октября 2005 г.). "PHP набирает популярность на предприятиях, соперничая с Java". InfoWorld . Архивировано из оригинала 13 июля 2014 г.
  253. ^ "Cross Reference: /PHP_5_4/ext/standard/". php.net . Архивировано из оригинала 16 марта 2012 . Получено 16 декабря 2014 .
  254. ^ "Разработка пользовательских расширений PHP". devnewz.com . 2002-09-09. Архивировано из оригинала 2008-02-18 . Получено 2008-02-25 .
  255. ^ "Почему Zephir?". zephir-lang.com . 2015-10-20 . Получено 14.12.2015 .
  256. ^ "PHP Credits" . Получено 2018-12-16 .
  257. ^ «Изучайте PHP с помощью обучения PHP и сертификации PHP». www.zend.com . Получено 16.11.2020 .
  258. ^ Уокер, Джеймс (13.12.2021). «Что означает новый PHP Foundation для будущего PHP». How-To Geek . Получено 26.11.2023 .
  259. ^ "Новая жизнь PHP – PHP Foundation | Блог PhpStorm". Блог JetBrains . 22 ноября 2021 г. Получено 16 июня 2022 г.
  260. ^ "PHP Foundation: Отчет о влиянии и прозрачности 2022". thephp.foundation . Получено 27.11.2023 .
  261. ^ Пронский, Роман (2024-02-26). "PHP Foundation: Impact and Transparency Report 2023". PHP Foundation . Получено 2024-04-01 .
  262. ^ Андерсон, Тим. «PHP Foundation создан для финансирования основных разработчиков». www.theregister.com . Получено 05.12.2023 .
  263. ^ "Языки программирования: этот старый фаворит снова набирает популярность". ZDNET . Получено 2023-12-05 .
  264. ^ "PHP 8.1 выпущен с перечислениями, свойствами только для чтения и волокнами". www.i-programmer.info . Получено 2023-12-05 .
  265. ^ "Пришло время для PHP Foundation #StopBreakingPHP". trongate.io . Получено 27.11.2023 .
  266. ^ "Совместимость WordPress 6.4 PHP". Сделайте хостинг WordPress . 2023-11-16 . Получено 2023-11-27 .
  267. ^ "PHP". Sovereign Tech Fund . Получено 2024-05-26 .
  268. ^ ab "Общие соображения по установке". php.net . Получено 2013-09-22 .
  269. ^ "Архив новостей: Выпущен PHP 5.3.3!". php.net . 2010-07-22.
  270. ^ "FastCGI Process Manager (FPM)". php.net . Получено 2013-09-22 .
  271. ^ "Использование командной строки: Введение". php.net . Получено 22.09.2013 .
  272. ^ "Использование командной строки: различия с другими SAPI". php.net . Получено 22.09.2013 .
  273. ^ ab "Общие соображения по установке". php.net . Получено 2013-09-22 .
  274. ^ "PHP: Apache 2.x в Microsoft Windows". php.net . Архивировано из оригинала 2013-09-26 . Получено 2013-09-22 .
  275. ^ "Использование командной строки: Введение". php.net . Получено 22.09.2013 .
  276. ^ "Установка PHP-GTK 2". php.net . Архивировано из оригинала 2013-12-12 . Получено 2013-09-22 .
  277. ^ "AWS SDK для PHP". aws.amazon.com . Получено 2014-03-06 .
  278. ^ "Windows Azure SDK для PHP — Interoperability Bridges and Labs Center". interoperabilitybridges.com . Архивировано из оригинала 20.03.2014 . Получено 06.03.2014 .
  279. ^ "Конфигурация времени выполнения: Содержание". php.net . Получено 2013-09-22 .
  280. ^ "Директивы php.ini: Список директив php.ini". php.net . Получено 2013-09-22 .
  281. ^ "Конфигурация времени выполнения: Файл конфигурации". PHP.net . Получено 2013-09-22 .
  282. ^ «Директивы php.ini: Список разделов php.ini». PHP.net . Проверено 22 сентября 2013 г.
  283. ^ "Конфигурация времени выполнения: где может быть установлен параметр конфигурации". PHP.net . Получено 22.09.2013 .
  284. ^ "PHP Manual Image Processing and GD;". php.net . Получено 2011-04-09 .
  285. ^ "PHP Server-Side Scripting Language". Университет Индианы . 2007-04-04. Архивировано из оригинала 2016-01-21 . Получено 2008-02-25 .
  286. ^ "Технология JavaServer Pages — Технический документ по сравнению методов JavaServer Pages для динамического содержимого на стороне сервера". Sun Microsystems . Получено 25.02.2008 .
  287. ^ "Пять простых способов настроить приложение LAMP". IBM . 2011-01-25.
  288. ^ "PHP в основе: структура расширения". PHP.net . Архивировано из оригинала 2013-09-26 . Получено 2013-09-22 .
  289. ^ "PHP в основе: расширение "counter" — продолжающийся пример". PHP.net . Архивировано из оригинала 2013-09-26 . Получено 2013-09-22 .
  290. ^ "Extension Writing Part I: Introduction to PHP and Zend". Zend Technologies . 2005-03-01. Архивировано из оригинала 2013-09-24 . Получено 2013-09-22 .
  291. ^ "Extension Writing Part II: Parameters, Arrays, and ZVALs". Zend Technologies . 2005-06-06. Архивировано из оригинала 2013-09-26 . Получено 2013-09-22 .
  292. ^ "Extension Writing Part II: Parameters, Arrays, and ZVALs (continued)". Zend Technologies . 2005-06-06. Архивировано из оригинала 2013-09-26 . Получено 2013-09-22 .
  293. ^ "Extension Writing Part III: Resources". Zend Technologies . 2006-05-12. Архивировано из оригинала 2013-09-26 . Получено 2013-09-22 .
  294. ^ "Обертывание классов C++ в расширение PHP". Zend Technologies . 2009-04-22. Архивировано из оригинала 2013-09-20 . Получено 2013-09-22 .
  295. ^ "Расширение PHP с помощью C++?". Stack Overflow . Получено 22.09.2013 .
  296. ^ «Как использовать код C++ для взаимодействия с PHP?». Stack Overflow . Получено 22.09.2013 .
  297. ^ Големон, Сара (2006). Расширение и внедрение PHP . Sams. ISBN 978-0-672-32704-9.
  298. ^ "Запрос № 46919: Многопоточность". PHP.net . Получено 2013-09-22 .
  299. ^ "pthreads: Введение (Руководство по PHP)". PHP.net . Получено 2013-09-22 .
  300. ^ "PECL :: Пакет :: pthreads". pecl.php.net . Получено 2014-02-09 .
  301. ^ "Руководство: Требования к установке#PHP" . МедиаВики. 25 января 2010 г. Проверено 26 февраля 2010 г. PHP — это язык программирования, на котором написан MediaWiki [...]
  302. ^ "О WordPress" . Получено 2010-02-26 . WordPress был [...] построен на PHP
  303. ^ Кемпкенс, Алекс. «Joomla! — Система управления контентом для создания веб-сайтов и приложений».
  304. ^ "PHP и Drupal". Drupal.org. 16 сентября 2007 г. Архивировано из оригинала 2010-02-08 . Получено 2010-06-13 .
  305. ^ "О нас". Moodle.org. Архивировано из оригинала 2010-01-11 . Получено 2009-12-20 .
  306. ^ "Требования к серверу SilverStripe". Архивировано из оригинала 28 ноября 2014 г. Получено 13 октября 2014 г. SilverStripe требует PHP 5.3.2+
  307. ^ Иде, Энди (2013-01-31). "PHP просто растёт и растёт" . Получено 2013-04-01 .
  308. ^ «Статистика использования и доля рынка PHP версии 4 для веб-сайтов, сентябрь 2024 г.». w3techs.com .
  309. ^ «Статистика использования и доля рынка PHP версии 5 для веб-сайтов, сентябрь 2024 г.». w3techs.com .
  310. ^ «Статистика использования и доля рынка PHP версии 7 для веб-сайтов, сентябрь 2024 г.». w3techs.com .
  311. ^ «Статистика использования и доля рынка PHP версии 8 для веб-сайтов, сентябрь 2024 г.». w3techs.com .
  312. ^ "Национальная база данных уязвимостей (NVD) Статистика уязвимостей поиска" . Получено 22.11.2019 .
  313. ^ "PHP-related vulnerabilities on the National Vulnerability Database". 2012-07-05. Архивировано из оригинала 2009-06-28 . Получено 2013-04-01 .
  314. ^ «Заметки о встрече разработчиков, ноябрь 2005 г.».
  315. ^ "Решение о режиме Taint, ноябрь 2007". Архивировано из оригинала 2009-02-26.
  316. ^ "PHP: rfc:taint". wiki.php.net .
  317. ^ "Hardened-PHP Project". 2008-08-15. Архивировано из оригинала 2019-02-24 . Получено 2019-08-22 .
  318. ^ «Документация Snuffleupagus».
  319. ^ "Безопасность: использование глобальных регистров". PHP Manual . PHP.net. Архивировано из оригинала 2013-09-27 . Получено 2013-09-22 .
  320. ^ "Волшебные кавычки". PHP Manual . PHP.net. Архивировано из оригинала 2014-02-08 . Получено 2014-01-17 .
  321. ^ "директива конфигурации 'engine'". PHP: Конфигурация среды выполнения . PHP.net . Получено 2014-02-13 .
  322. ^ "PHP Security Exploit With GIF Images". 2007-06-22. Архивировано из оригинала 2013-09-27 . Получено 2013-09-22 .
  323. ^ "PHP security Exploit with GIF images". Блог PHP Classes. 2007-06-20 . Получено 2013-09-22 .
  324. ^ "Передача вредоносного PHP через getimagesize()". 2007-06-04. Архивировано из оригинала 2013-09-21 . Получено 2013-09-22 .
  325. ^ "Директива конфигурации 'enable_dl'". PHP: Конфигурация среды выполнения . PHP.net . Получено 2014-02-13 .
  326. ^ "Справочник функций PHP: dl()". PHP.net . Получено 2013-09-22 .
  327. ^ "Мой хостер не исправит своего трояна". ​​WebHosting Talk . Получено 22.09.2013 .
  328. ^ Raz0r (25 января 2013 г.). «Форум Simple Machines <= 2.0.3 Сброс пароля администратора».{{cite web}}: CS1 maint: числовые имена: список авторов ( ссылка )
  329. ^ Безопасность Ниббла. «TYPO3-SA-2010-020, TYPO3-SA-2010-022 ОБЪЯСНЕНИЕ».
  330. ^ «Криптостойкость и небезопасное сравнение». ahack.ru (на русском языке). Архивировано из оригинала 4 июля 2017 года.{{cite web}}: CS1 maint: неподходящий URL ( ссылка )
  331. ^ Krawczyk, Pawel (2013). "Наиболее распространенные атаки на веб-приложения". IPSec.pl. Архивировано из оригинала 2015-04-15 . Получено 2015-04-15 .
  332. ^ Кравчик, Павел (2013). «Итак, каковы «самые критические» недостатки приложений? В новом рейтинге OWASP Top 10». IPSec.pl . Получено 15.04.2015 .
  333. ^ "PHP: Rand – Руководство".
  334. ^ "PHP: Mt_rand - Руководство".
  335. ^ "PHP: Random_int – Руководство".
  336. ^ Аргирос, Джордж; Киайяс, Аггелос (10 августа 2012 г.). «Я забыл ваш пароль: случайные атаки на приложения PHP». usenix.org . USENIX . Получено 19 апреля 2024 г. .
  337. ^ "PHP: RFC:release_cycle_update".
  338. ^ "Поддержка PHP для PHP 7.2 – 8.0 | PHP LTS | Zend by Perforce" . Получено 2024-05-23 .
  339. ^ "Pagely PHP Долгосрочная страница поддержки". Pagely . Получено 2024-09-14 .

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

Послушайте эту статью ( 35 минут )
Разговорный значок Википедии
Этот аудиофайл был создан на основе редакции этой статьи от 23 ноября 2011 года и не отражает последующие правки. ( 2011-11-23 )
  • Форд, Пол (11 июня 2015 г.). «Что такое код?». Bloomberg Businessweek . Какой абсолютный минимум я должен знать о PHP?
  • Официальный сайт
Взято с "https://en.wikipedia.org/w/index.php?title=PHP&oldid=1253756745"