PHP — это язык сценариев общего назначения , предназначенный для веб-разработки . [8] Первоначально он был создан датско-канадским программистом Расмусом Лердорфом в 1993 году и выпущен в 1995 году . [9] [10] Эталонная реализация PHP сейчас производится PHP Group. [11] Первоначально PHP был аббревиатурой Personal Home Page , [12] [13] , но теперь он означает рекурсивный инициализм PHP: Препроцессор гипертекста . [14]
Код PHP обычно обрабатывается на веб-сервере интерпретатором PHP , реализованным в виде модуля , демона или исполняемого файла Common Gateway Interface (CGI). На веб-сервере результат интерпретированного и выполненного PHP-кода, который может быть любым типом данных, например, сгенерированными данными HTML или двоичными изображениями, будет формировать весь или часть HTTP- ответа. Существуют различные системы веб-шаблонов , системы управления веб-контентом и веб-фреймворки , которые можно использовать для организации или облегчения генерации такого ответа. Кроме того, PHP можно использовать для многих задач программирования вне веб-контекста, таких как автономные графические приложения [15] и управление дроном . [16] PHP-код также можно выполнить напрямую из командной строки .
Стандартный интерпретатор PHP, работающий на базе Zend Engine , является бесплатным программным обеспечением , распространяемым по лицензии PHP . PHP широко портирован и может быть развернут на большинстве веб-серверов в различных операционных системах и платформах . [17]
Язык PHP развивался без письменной формальной спецификации или стандарта, при этом исходная реализация выступала в качестве стандарта де-факто , которому стремились следовать другие реализации.
W3Techs сообщает, что по состоянию на 2024 год [обновлять]PHP используется на 76,6% всех веб-сайтов, язык программирования которых можно определить, и 58,8% из них используют PHP 7, который устарел и известен как небезопасный. [18] Кроме того, наиболее используемая версия 8.x, 8.0, больше не поддерживается, [19] это означает, что подавляющее большинство пользователей PHP используют устаревшие версии, и более половины всех веб-сайтов, использующих PHP или нет (чьи язык программирования может быть определен) небезопасны.
Разработка PHP началась в 1993 году [9] , когда Расмус Лердорф написал несколько программ Common Gateway Interface (CGI) на C , [20] [21] , которые он использовал для поддержки своей личной домашней страницы . Он расширил их для работы с веб-формами и взаимодействия с базами данных и назвал эту реализацию «персональной домашней страницей/интерпретатором форм» или PHP/FI.
Пример раннего синтаксиса PHP : [22]
<!-- включить / текст / заголовок . html --><!-- getenv HTTP_USER_AGENT --> <!-- if substr $exec_result Mozilla --> Эй , вы используете Netscape !< p > <!-- endif -- ><!-- база данных sql select * from table , где user = ' $username' --> <!-- ifless $numentries 1 --> Извините , эта запись не существует < p > <!-- endif exit --> Добро пожаловать <!-- $user -->!< p > У вас осталось <!-- $index : 0 --> кредитов на вашем счету .< p > <!-- включить / текст / нижний колонтитул . html -->
PHP/FI можно использовать для создания простых динамических веб-приложений . Чтобы ускорить сообщение об ошибках и улучшить код, Лердорф первоначально объявил о выпуске PHP/FI как «Инструменты личной домашней страницы (PHP Tools) версии 1.0» в дискуссионной группе Usenet comp.infosystems.www.authoring.cgi 8 июня 1995 года. [1] [23] Этот выпуск включал базовые функции, такие как Perl-подобные переменные , обработку форм и возможность встраивания HTML . К этому моменту синтаксис изменился и стал напоминать синтаксис Perl , но стал более простым, более ограниченным и менее последовательным. [12] [11]
Ранний PHP никогда не задумывался как новый язык программирования ; скорее, он разрастался органично, и Лердорф, оглядываясь назад, заметил: «Я не знаю, как это остановить [...] никогда не было никакого намерения писать язык программирования [...] Я совершенно понятия не имею, как писать язык программирования [...] Я просто продолжал добавлять следующий логический шаг на пути». [24] Начала формироваться команда разработчиков, и после нескольких месяцев работы и бета- тестирования официально выпущен PHP/FI 2 в ноябре 1997 года [25] . [ нужна цитата ]
Тот факт, что PHP изначально не был спроектирован, а был разработан органично, привел к противоречивым именам функций и непоследовательному порядку их параметров. [26] В некоторых случаях имена функций выбирались так, чтобы они соответствовали библиотекам нижнего уровня, которые PHP «обертывал», [27] в то время как в некоторых очень ранних версиях PHP длина имен функций использовалась внутри как хэш-функция. , поэтому имена были выбраны для улучшения распределения хеш-значений . [28]
Зеев Сураски и Энди Гутманс переписали парсер в 1997 году и легли в основу PHP 3, изменив название языка на рекурсивную аббревиатуру PHP: Hypertext Preprocessor . [11] [29] После этого началось публичное тестирование PHP 3, и официальный запуск состоялся в июне 1998 года. Затем Сураски и Гутманс начали новую переписывание ядра PHP, создав Zend Engine в 1999 году. [30] Они также основали Zend. Технологии в Рамат-Гане , Израиль . [11]
22 мая 2000 года был выпущен PHP 4 на базе Zend Engine 1.0. [11] К августу 2008 года эта ветка достигла версии 4.4.9. PHP 4 больше не находится в разработке, и выпуск каких-либо обновлений безопасности не планируется. [31] [32]
1 июля 2004 года был выпущен PHP 5 на базе нового Zend Engine II. [11] PHP 5 включает новые функции, такие как улучшенная поддержка объектно-ориентированного программирования , расширение PHP Data Objects (PDO) (которое определяет легкий и согласованный интерфейс для доступа к базам данных), а также многочисленные улучшения производительности. [33] В 2008 году PHP 5 стал единственной стабильной версией, находящейся в стадии разработки. Позднее статическое связывание отсутствовало в предыдущих версиях PHP и было добавлено в версии 5.3. [34] [35]
Многие громкие проекты с открытым исходным кодом прекратили поддержку PHP 4 в новом коде с 5 февраля 2008 года из-за инициативы GoPHP5, [36] предоставленной консорциумом разработчиков PHP, продвигающих переход с PHP 4 на PHP 5. [37 ] [38]
Со временем интерпретаторы PHP стали доступны в большинстве существующих 32- и 64-битных операционных систем либо путем их создания из исходного кода PHP, либо с использованием предварительно созданных двоичных файлов. [39] Для версий PHP 5.3 и 5.4 единственными доступными двоичными дистрибутивами Microsoft Windows были 32-битные сборки IA-32 , [40] [41] требующие режима совместимости с 32-битной Windows при использовании служб IIS на 64-битной версии. -битная платформа Windows. PHP версии 5.5 сделал 64-битные сборки x86-64 доступными для Microsoft Windows. [42]
Официальная поддержка безопасности PHP 5.6 закончилась 31 декабря 2018 г. [43]
PHP получил неоднозначные отзывы из-за отсутствия встроенной поддержки Unicode на уровне ядра языка. [44] [45] В 2005 году под руководством Андрея Змиевского был инициирован проект по внедрению встроенной поддержки Unicode в PHP путем внедрения библиотеки International Components for Unicode (ICU) и внутреннего представления текстовых строк в формате UTF-16 . [46] Поскольку это привело бы к серьезным изменениям как во внутреннем устройстве языка, так и в пользовательском коде, планировалось выпустить его как версию 6.0 языка вместе с другими основными функциями, которые тогда находились в разработке. [47]
Однако нехватка разработчиков, которые понимали необходимые изменения, а также проблемы с производительностью, возникающие из-за преобразования в UTF-16, который редко используется в веб-контексте, привели к задержкам в реализации проекта. [48] В результате в 2009 году была создана версия PHP 5.3, в которой многие функции, не относящиеся к Unicode, были перенесены из PHP 6, в частности, пространства имен. В марте 2010 года проект в его нынешнем виде был официально закрыт, и была подготовлена версия PHP 5.4, которая будет содержать большинство оставшихся не-Unicode функций PHP 6, таких как признаки и повторное связывание замыканий. [49] Первоначальные надежды заключались в том, что будет разработан новый план интеграции Unicode, но к 2014 году ни один из них не был принят. [ нужна цитата ]
В 2014 и 2015 годах была разработана новая основная версия PHP — PHP 7. Нумерация этой версии вызвала некоторые споры среди внутренних разработчиков. [50] Хотя эксперименты PHP 6 с Unicode никогда не публиковались, в нескольких статьях и названиях книг упоминались имена PHP 6, что могло бы вызвать путаницу, если бы в новой версии это имя использовалось повторно. [51] После голосования было выбрано название PHP 7. [52]
Основой PHP 7 является ветвь PHP , которая изначально называлась PHP следующего поколения ( phpng ). Его авторами являются Дмитрий Стогов, Синьчен Хуэй и Никита Попов [53] и он направлен на оптимизацию производительности PHP за счет рефакторинга Zend Engine, сохраняя при этом почти полную языковую совместимость. [54] К 14 июля 2014 года тесты на базе WordPress , которые служили основным набором тестов для проекта phpng, показали почти 100%-ное увеличение производительности. Изменения в phpng упрощают повышение производительности в будущих версиях, поскольку более компактные структуры данных и другие изменения считаются более подходящими для успешного перехода на JIT -компилятор. [55] Из-за существенных изменений переработанный Zend Engine был назван Zend Engine 3 , пришедший на смену Zend Engine 2, использовавшемуся в PHP 5. [56]
Из-за серьезных внутренних изменений в phpng он должен получить новый основной номер версии PHP, а не второстепенный выпуск PHP 5, в соответствии с процессом выпуска PHP. [57] В основных версиях PHP разрешено нарушать обратную совместимость кода, и поэтому PHP 7 предоставил возможность для других улучшений, помимо phpng, которые требуют нарушений обратной совместимости. [ нужна цитация ] В частности, он включал следующие изменения:
->
, []
, ()
, {}
и ::
с произвольными значимыми левыми выражениями. [59]foreach
было изменено, чтобы сделать его более предсказуемым. [61]mysql
расширение. [63]list()
было изменено, чтобы исключить поддержку строк. [64]<%
и %>
и <script language="php"> ... </script>
. [65]default
предложений. [66]PHP 7 также включает новые возможности языка. В частности, были введены объявления возвращаемого типа для функций [70] , которые дополняют существующие объявления типов параметров, а также поддержка скалярных типов (целое число, число с плавающей запятой, строка и логическое значение) в объявлениях параметров и возвращаемых типов. [71]
PHP 8 был выпущен 26 ноября 2020 года и в настоящее время является второй по популярности основной версией PHP. PHP 8 является основной версией и содержит существенные изменения по сравнению с предыдущими версиями. [72] [73] Новые функции и заметные изменения включают в себя:
Компиляция «точно в срок» поддерживается в PHP 8. [74]
JIT-компилятор PHP 8 может обеспечить существенное повышение производительности в некоторых случаях использования, [75] [76] , в то время как разработчик PHP Никита Попов заявил, что повышение производительности для большинства веб-сайтов будет менее существенным, чем при обновлении с PHP 5 до PHP 7. [77] Существенные улучшения ожидаются больше для операций математического типа, чем для обычных случаев использования в веб-разработке. [77] Кроме того, JIT-компилятор дает возможность в будущем перенести часть кода с C на PHP благодаря повышению производительности в некоторых случаях использования. [78]
В PHP 8 появилось это match
выражение. [79] Выражение match концептуально похоже на switch
оператор и в некоторых случаях использования более компактно. [80] Поскольку match
это выражение, его результат может быть присвоен переменной или возвращен из функции. [81]
В PHP 8 представлены типы объединения, новый static
тип возвращаемого значения и новый mixed
тип. [72]
«Атрибуты», часто называемые «аннотациями» в других языках программирования, были добавлены в PHP 8, что позволяет добавлять метаданные в классы. [72]
throw
из утверждения превратился в выражение. [82] Это позволяет создавать исключения в местах, которые ранее были невозможны. [72]
PHP 8 включает изменения, позволяющие использовать альтернативный, более краткий или более согласованный синтаксис в ряде сценариев. Например, оператор nullsafe аналогичен оператору объединения значений null ??
, но используется при вызове методов. [83] Следующий фрагмент кода не выдаст ошибку, если getBirthday()
возвращает значение null:
$human_readable_date = $user -> getBirthday () ?-> diffForHumans ();
Продвижение свойств конструктора было добавлено как « синтаксический сахар », позволяющее автоматически устанавливать свойства класса при передаче параметров в конструктор класса . [72] Это уменьшает количество шаблонного кода , который необходимо написать. [ нужна цитата ]
Другие незначительные изменения включают поддержку использования ::class
на объектах, которая служит альтернативой использованию get_class()
; [72] незахватывающие уловы в блоках try-catch; настройки синтаксиса переменных для устранения несоответствий; поддержка именованных аргументов; и поддержка завершающих запятых в списках параметров, что повышает согласованность с поддержкой завершающих запятых в других контекстах, например в массивах. [ нужна цитата ]
WeakMap
содержит ссылки на объекты, но эти ссылки не предотвращают сбор мусора таких объектов . [84] Это может обеспечить повышение производительности в сценариях, где данные кэшируются ; это имеет особое значение для объектно-реляционных отображений (ORM). [72]DateTime
объектов из интерфейсов и добавление интерфейса Stringable
, который можно использовать для подсказок типов. [ нужна цитата ]PHP 8.1 был выпущен 25 ноября 2021 года. [87] В него добавлена поддержка перечислений (также называемых «перечислениями»), объявления свойств как readonly
(что предотвращает изменение свойства после инициализации) и распаковки массива с помощью строковых ключей. Новый тип Never можно использовать для указания того, что функция не возвращает результат. [88]
PHP 8.2 был выпущен 8 декабря 2022 года. [89] Новыми в этом выпуске являются readonly
классы (свойства экземпляров которых неявно доступны только для чтения), типы дизъюнктивной нормальной формы (DNF) и random
расширение, которое предоставляет генератор псевдослучайных чисел с объектным кодом. ориентированный API . [90]
Начиная с 28 июня 2011 года группа разработчиков PHP установила график выпуска новых версий PHP. [57] Согласно этой системе, по крайней мере, один выпуск должен происходить каждый месяц. Раз в год должен выходить минорный выпуск, который может включать новые функции. Каждый второстепенный выпуск должен поддерживаться как минимум в течение двух лет с исправлениями безопасности и ошибок, а затем не менее одного года только с исправлениями безопасности, что в общей сложности составляет трехлетний процесс выпуска для каждого второстепенного выпуска. Никакие новые функции, кроме небольших и автономных, не могут быть добавлены в второстепенную версию в течение трехлетнего процесса выпуска.
Талисманом проекта PHP является elePHPant , синий слон с логотипом PHP на боку, созданный Винсентом Понтье [201] в 1998 году . [202] «Буквы (PHP) образовывали форму слона, если смотреть в боковой угол». [203] elePHPant иногда имеет другой цвет, когда он находится в форме плюшевой игрушки . [204]
За прошедшие годы было создано множество вариаций этого талисмана. Только elePHPants, созданные по оригинальному дизайну Винсента Понтье, считаются официальными сообществом. [205] Они являются коллекционными, и некоторые из них чрезвычайно редки. [206]
Следующий «Привет, мир!» Программа написана на PHP-коде, встроенном в HTML- документ:
<!DOCTYPE html> < html > < head > < title > PHP "Hello, World!" программа </ title > </ head > < body > < p > <? = 'Привет, мир!' ?> </ p > </ body > </ html >
Однако, поскольку не требуется встраивание PHP-кода в HTML, простейшая версия Hello, World! может быть записано следующим образом, с опущенным закрывающим тегом, ?>
что является предпочтительным в файлах, содержащих чистый код PHP. [207]
<?php echo 'Привет, мир!' ;
Интерпретатор PHP выполняет код PHP только внутри своих разделителей . Все, что находится за пределами разделителей, не обрабатывается PHP, хотя текст, отличный от PHP, по-прежнему подчиняется структурам управления, описанным в коде PHP. Наиболее распространенными разделителями являются <?php
открытие и ?>
закрытие разделов PHP. Сокращенная форма <?
также существует. Этот короткий разделитель делает файлы сценариев менее переносимыми, поскольку их поддержка может быть отключена в локальной конфигурации PHP и поэтому не рекомендуется. [208] [209] И наоборот, нет никаких рекомендаций против короткого тега echo <?=
. [210] До PHP 5.4.0 этот короткий синтаксис echo
работал только при short_open_tag
включенной настройке конфигурации, тогда как для PHP 5.4.0 и более поздних версий он всегда доступен. [211] [212] [208] Целью всех этих разделителей является отделение кода PHP от содержимого, не относящегося к PHP, такого как код JavaScript или разметка HTML. [213] Итак самое короткое «Hello, World!» программа , написанная на PHP:
<? = 'Привет, мир!' ;
Первая форма разделителей <?php
и ?>
в XHTML и других документах XML создает правильно сформированные инструкции обработки XML. [214] Это означает, что результирующая смесь PHP-кода и другой разметки в серверном файле сама по себе представляет собой правильно сформированный XML.
Переменные начинаются с символа доллара , и тип не нужно указывать заранее. В PHP 5 появились объявления типов , которые позволяют функциям заставлять свои параметры быть объектами определенного класса, массивами, интерфейсами или функциями обратного вызова . Однако до PHP 7 объявления типов нельзя было использовать со скалярными типами, такими как целые числа или строки. [71]
Ниже приведен пример объявления и инициализации переменных PHP.
<?php $name = 'Джон' ; // объявляемая и инициализируемая переменная строкового типа $age = 18 ; // объявляемая и инициализируемая переменная целочисленного типа $height = 5.3 ; // объявляется и инициализируется переменная типа double echo $name . ' является ' . $высота . "м рост \n " ; // объединение переменных и строк echo " $name исполнилось $age лет." ; // интерполируем переменные в строку ?>
В отличие от имен функций и классов, имена переменных чувствительны к регистру. Как строки в двойных кавычках (""), так и строки Heredoc предоставляют возможность интерполировать значение переменной в строку. [215] PHP воспринимает новую строку как пробел , как в языке свободной формы , а операторы завершаются точкой с запятой. [216] PHP имеет три типа синтаксиса комментариев : /* */
помечает блочные и встроенные комментарии; //
или #
используются для однострочных комментариев. [217] Этот echo
оператор — одно из нескольких средств, предоставляемых PHP для вывода текста. [ нужна цитата ]
С точки зрения ключевых слов и синтаксиса языка PHP похож на синтаксис в стиле C. if
Условия, for
а также while
циклы и возвраты функций аналогичны по синтаксису таким языкам, как C, C++, C#, Java и Perl. [ нужна цитата ]
PHP свободно типизирован . Он хранит целые числа в диапазоне, зависящем от платформы, в виде 32-, 64- или 128-битного целого числа со знаком , эквивалентного длинному типу языка C. Целые числа без знака в определенных ситуациях преобразуются в значения со знаком, что отличается от поведения многих других языков программирования. [218] Целочисленным переменным можно присваивать десятичные (положительные и отрицательные), восьмеричные , шестнадцатеричные и двоичные обозначения. [ нужна цитата ]
Числа с плавающей запятой также хранятся в диапазоне, зависящем от платформы. Их можно указать с помощью записи с плавающей запятой или двух форм научной записи . [219] PHP имеет собственный логический тип, похожий на собственные логические типы в Java и C++ . Используя правила преобразования логических типов, ненулевые значения интерпретируются как истинные, а нули — как ложные, как в Perl и C++. [219]
Тип данных null представляет собой переменную, не имеющую значения; NULL
— единственное разрешенное значение для этого типа данных. [219]
Переменные типа «ресурс» представляют собой ссылки на ресурсы из внешних источников. Обычно они создаются функциями из определенного расширения и могут обрабатываться только функциями из того же расширения; примеры включают ресурсы файлов, изображений и баз данных. [219]
Массивы могут содержать элементы любого типа, который может обрабатывать PHP, включая ресурсы, объекты и даже другие массивы. Порядок сохраняется в списках значений и хэшах как с ключами, так и со значениями, и их можно смешивать. [219] PHP также поддерживает строки , которые можно использовать с одинарными кавычками, двойными кавычками, синтаксисом nowdoc или heredoc . [220]
Стандартная библиотека PHP (SPL) пытается решить стандартные проблемы и реализует эффективные интерфейсы и классы доступа к данным. [221]
PHP определяет большой набор функций на основном языке, и многие из них также доступны в различных расширениях; эти функции хорошо документированы в онлайн-документации PHP. [222] Однако встроенная библиотека имеет широкий спектр соглашений об именах и связанных с ними несоответствий, как описано выше в разделе «История».
Пользовательские функции могут быть определены разработчиком:
function myAge ( int $birthYear ) : string { // вычисляем возраст, вычитая год рождения из текущего года. $yearsOld = дата ( 'Y' ) - $birthYear ; // возвращаем возраст в описательной строке. вернуть $yearsOld . ( $yearsOld == 1 ? 'год' : 'лет' ); }echo 'Я сейчас' . Мой возраст ( 1995 ) . ' старый.' ;
По состоянию на 2024 год результат приведенной выше примерной программы будет следующим: «Мне сейчас 29 лет».
Вместо указателей на функции на функции в PHP можно ссылаться по строке, содержащей их имя. Таким образом, можно использовать обычные функции PHP, например, в качестве обратных вызовов или в таблицах функций . [223] Пользовательские функции могут быть созданы в любое время без прототипирования . [222] [223] Функции могут быть определены внутри блоков кода, что позволяет во время выполнения принимать решение о том, следует ли определять функцию. Существует function_exists
функция, которая определяет, определена ли уже функция с данным именем. В вызовах функций должны использоваться круглые скобки, за исключением функций -конструкторов классов с нулевым аргументом , вызываемых с помощью оператора PHP new
, в этом случае круглые скобки необязательны. [ нужна цитата ]
Начиная с PHP 4.0.1 create_function()
, тонкая оболочка вокруг eval()
, позволяла создавать обычные функции PHP во время выполнения программы; он был объявлен устаревшим в PHP 7.2 и удален в PHP 8.0 [224] в пользу синтаксиса анонимных функций или « замыканий » [225] , которые могут захватывать переменные из окружающей области видимости, который был добавлен в PHP 5.3. Синтаксис сокращенной стрелки был добавлен в PHP 7.4: [226]
функция getAdder ( $x ) { return fn ( $y ) => $x + $y ; }$adder = getAdder ( 8 ); эхо $adder ( 2 ); // печатает "10"
В приведенном выше примере getAdder()
функция создает замыкание, используя переданный аргумент $x
, который принимает дополнительный аргумент $y
и возвращает созданное замыкание вызывающей стороне. Такая функция является объектом первого класса, то есть ее можно хранить в переменной, передавать в качестве параметра другим функциям и т. д. [227]
Что необычно для динамически типизированного языка, PHP поддерживает объявления типов для параметров функции, которые применяются во время выполнения. Это поддерживается для классов и интерфейсов с PHP 5.0, для массивов с PHP 5.1, для «вызываемых объектов» с PHP 5.4 и скалярных типов (целочисленных, плавающих, строковых и логических) с PHP 7.0. [71] PHP 7.0 также имеет объявления типов для типов возвращаемых функций, выраженных путем размещения имени типа после списка параметров, которому предшествует двоеточие. [70] Например, getAdder
функция из предыдущего примера может быть аннотирована такими типами в PHP 7:
функция getAdder ( int $x ) : Closure { return fn ( int $y ) : int => $x + $y ; }$adder = getAdder ( 8 ); эхо $adder ( 2 ); // печатает «10» echo $adder ( null ); // выдает исключение, поскольку был передан неверный тип $adder = getAdder ([]); // также вызовет исключение
По умолчанию объявления скалярных типов следуют принципам слабой типизации. Так, например, если тип параметра равен int
, PHP позволит передавать в эту функцию не только целые числа, но также преобразуемые числовые строки, числа с плавающей запятой или логические значения и преобразует их. [71] Однако в PHP 7 имеется режим «строгой типизации», который при использовании запрещает такие преобразования для вызовов функций и возвратов данных внутри файла. [71]
Базовые функции объектно-ориентированного программирования были добавлены в PHP 3 и улучшены в PHP 4. [11] Это позволило PHP получить дополнительную абстракцию, упрощая творческие задачи для программистов, использующих этот язык. Обработка объектов была полностью переписана для PHP 5, что расширило набор функций и повысило производительность. [228] В предыдущих версиях PHP объекты обрабатывались как типы значений . [228] Недостаток этого метода заключался в том, что коду приходилось интенсивно использовать «ссылочные» переменные PHP, если он хотел изменить переданный объект, а не создавать его копию. В новом подходе на объекты ссылаются по дескриптору , а не по значению. [ нужна цитата ]
В PHP 5 появились частные и защищенные переменные-члены и методы, а также абстрактные классы , финальные классы , абстрактные методы и финальные методы . Он также представил стандартный способ объявления конструкторов и деструкторов , аналогичный тому, который используется в других объектно-ориентированных языках, таких как C++ , и стандартную модель обработки исключений . Кроме того, в PHP 5 добавлены интерфейсы и разрешена реализация нескольких интерфейсов. Существуют специальные интерфейсы, которые позволяют объектам взаимодействовать с системой времени выполнения. Объекты, реализующие ArrayAccess, могут использоваться с синтаксисом массива , а объекты, реализующие Iterator или IteratorAggregate , могут использоваться с foreach
языковой конструкцией . В движке нет функции виртуальных таблиц , поэтому во время компиляции статические переменные связываются с именем, а не ссылкой. [229]
Если разработчик создает копию объекта, используя зарезервированное слово clone
, движок Zend проверит, __clone()
определен ли метод. Если нет, он вызовет значение по умолчанию __clone()
, которое скопирует свойства объекта. Если __clone()
метод определен, то он будет отвечать за установку необходимых свойств в создаваемом объекте. Для удобства движок предоставляет функцию, которая импортирует свойства исходного объекта, поэтому программист может начать с реплики исходного объекта по значению и переопределять только те свойства, которые необходимо изменить. [230]
Видимость свойств и методов PHP определяется с помощью ключевых слов public
, private
и protected
. По умолчанию используется public, если используется только var ; var
является синонимом public
. Заявленные предметы public
доступны повсюду. protected
ограничивает доступ к унаследованным классам (и к классу, определяющему элемент). private
ограничивает видимость только классом, который определяет элемент. [231] Объекты одного и того же типа имеют доступ к частным и защищенным членам друг друга, даже если они не являются одним и тем же экземпляром. [ нужна цитата ]
Ниже приведен базовый пример объектно-ориентированного программирования в PHP 8:
<?phpабстрактный класс Пользователь{ защищенная строка $name ; публичная функция __construct ( строка $name ) { // делаем первую букву заглавной, а остальные строчными $this -> name = ucfirst ( strtolower ( $name )); } публичная функция Greeting () : строка { вернуть «Привет, меня зовут» . $this -> имя ; } абстрактная публичная функция job () : string ;}класс Студент расширяет Пользователь{ публичная функция __construct ( строка $name , частная строка $course ) { родитель :: __construct ( $name ); } публичная функция job () : строка { вернуть «Я учусь» . $this -> курс ; }} Учитель класса расширяет права пользователя{ публичная функция __construct ( строка $name , частный массив $teachingCourses ) { родитель :: __construct ( $name ); } публичная функция job () : строка { вернуть «Я преподаю» . implode ( ", " , $this -> LearningCourses ); }}$студенты = [ новый студент ( «Алиса» , «Информатика» ), новый студент ( «Боб» , «Информатика» ), новый студент ( «Чарли» , «Бизнес-исследования» ),];$учителя = [ новый Учитель ( «Дэн» , [ «Информатика» , «Информационная безопасность» ]), новый учитель ( «Эрин» , [ «Информатика» , «Программирование 3D-графики» ]), новый преподаватель ( «Фрэнки» , [ «Интернет-маркетинг» , «Бизнес-исследования» , «Электронная коммерция» ]),];foreach ([ $students , $teachers ] as $users ) { echo $users [ 0 ] :: класс . "с: \п " ; array_walk ( $users , функция ( пользователь $user ) { echo " { $user -> Greeting () } , { $user -> job () } \n " ; });}
Эта программа выводит следующее:
Студенты:Здравствуйте, меня зовут Алиса, я изучаю информатику.Здравствуйте, меня зовут Боб, я изучаю информатику.Здравствуйте, меня зовут Чарли, я изучаю бизнес-исследования.Учителя:Здравствуйте, меня зовут Дэн, я преподаю информатику, информационную безопасность.Здравствуйте, меня зовут Эрин, я преподаю информатику, программирование 3D-графики.Здравствуйте, меня зовут Фрэнки, я преподаю онлайн-маркетинг, бизнес-исследования, электронную коммерцию.
Единственной полной реализацией PHP является оригинал, известный просто как PHP. Он наиболее широко используется и работает на Zend Engine . Чтобы отличить его от других реализаций, его иногда неофициально называют «Zend PHP». Zend Engine компилирует исходный код PHP на лету во внутренний формат, который он может выполнять, таким образом, он работает как интерпретатор . [232] [233] Это также «эталонная реализация» PHP, поскольку PHP не имеет формальной спецификации, и поэтому семантика Zend PHP определяет семантику PHP. Из-за сложной и тонкой семантики PHP, определяемой тем, как работает Zend, конкурирующим реализациям сложно обеспечить полную совместимость. [ нужна цитата ]
Модель PHP с одним запросом на выполнение сценария и тот факт, что Zend Engine является интерпретатором, приводят к неэффективности; в результате были разработаны различные продукты, помогающие улучшить производительность PHP. Чтобы ускорить время выполнения и не компилировать исходный код PHP каждый раз при доступе к веб-странице, сценарии PHP также можно развертывать во внутреннем формате движка PHP с помощью кэша опкодов, который работает путем кэширования скомпилированной формы PHP-скрипт (коды операций) в общей памяти , чтобы избежать накладных расходов на анализ и компиляцию кода при каждом запуске сценария. Кэш опкодов Zend Opcache встроен в PHP начиная с версии 5.5. [234] Другим примером широко используемого кэша кодов операций является альтернативный кэш PHP (APC), который доступен как расширение PECL . [235]
Хотя Zend PHP по-прежнему остается самой популярной реализацией, было разработано несколько других реализаций. Некоторые из них являются компиляторами или поддерживают JIT-компиляцию и, следовательно, предлагают преимущества в производительности по сравнению с Zend PHP за счет отсутствия полной совместимости с PHP. [ нужна цитация ] Альтернативные реализации включают следующее:
create_function()
и eval()
. [239]PHP — это бесплатное программное обеспечение , распространяемое по лицензии PHP , которая предусматривает, что: [240]
Продукты, созданные на основе этого программного обеспечения, не могут называться «PHP», а «PHP» не может появляться в их названии без предварительного письменного разрешения от [email protected]. Вы можете указать, что ваше программное обеспечение работает совместно с PHP, сказав « Foo for PHP» вместо того, чтобы называть его «PHP Foo» или «phpfoo».
Это ограничение на использование «PHP» делает лицензию PHP несовместимой с лицензией General Public License (GPL), в то время как лицензия Zend несовместима из-за пункта о рекламе, аналогичного положению исходной лицензии BSD . [241]
PHP включает в свой дистрибутив исходного кода различные бесплатные библиотеки с открытым исходным кодом или использует их в результирующих двоичных сборках PHP. PHP — это, по сути, Интернет -система со встроенными модулями для доступа к серверам протокола передачи файлов (FTP) и многим серверам баз данных, включая PostgreSQL , MySQL , Microsoft SQL Server и SQLite (встроенная база данных), серверы LDAP и другие. . Многочисленные функции, знакомые программистам на языке C, например функции семейства stdio , доступны в стандартных сборках PHP. [242]
PHP позволяет разработчикам писать расширения на языке C , добавляющие функциональность языку PHP. Расширения PHP могут быть скомпилированы статически в PHP или загружены динамически во время выполнения. Было написано множество расширений для добавления поддержки Windows API , управления процессами в Unix-подобных операционных системах , многобайтовых строк ( Unicode ), cURL и нескольких популярных форматов сжатия . Другие функции PHP, доступные через расширения, включают интеграцию с Internet Relay Chat (IRC), динамическое создание изображений и контента Adobe Flash , объекты данных PHP (PDO) в качестве уровня абстракции, используемого для доступа к базам данных, [243] [244] [245] [246] [247] [248] [249] и даже синтез речи . Некоторые основные функции языка, например, работающие со строками и массивами, также реализованы как расширения. [250] Проект библиотеки расширений PHP (PECL) представляет собой хранилище расширений языка PHP. [251]
Некоторые другие проекты, такие как Zephir , предоставляют возможность создавать расширения PHP на языке высокого уровня и компилировать их в собственные расширения PHP. Такой подход вместо написания расширений PHP непосредственно на C упрощает разработку расширений и сокращает время, необходимое для программирования и тестирования. [252]
К декабрю 2018 года PHP Group состояла из десяти человек: Тис К. Арнтцен, Стиг Баккен, Шейн Каравео, Энди Гутманс , Расмус Лердорф, Сэм Руби , Саша Шуман, Зеев Сураски , Джим Уинстед и Андрей Змиевски . [253]
Zend Technologies предоставляет программистам сертификацию PHP на основе экзамена PHP 7 [254] (а ранее на основе PHP 5.5), чтобы они могли стать сертифицированными разработчиками PHP.
26 ноября 2021 года блог JetBrains объявил о создании The PHP Foundation, который будет спонсировать проектирование и разработку PHP. [256]
Существует два основных способа добавить поддержку PHP на веб-сервер — в виде собственного модуля веб-сервера или в виде исполняемого файла CGI. PHP имеет прямой интерфейс модуля, называемый интерфейсом программирования серверных приложений (SAPI), который поддерживается многими веб-серверами, включая HTTP-сервер Apache , Microsoft IIS и веб-сервер iPlanet . Некоторые другие веб-серверы, такие как OmniHTTPd, поддерживают интерфейс программирования приложений интернет-сервера (ISAPI), который представляет собой интерфейс модуля веб-сервера Microsoft . Если PHP не поддерживает модули для веб-сервера, его всегда можно использовать в качестве процессора Common Gateway Interface (CGI) или FastCGI ; в этом случае веб-сервер настроен на использование исполняемого файла CGI PHP для обработки всех запросов к файлам PHP. [257]
PHP-FPM (FastCGI Process Manager) — это альтернативная реализация FastCGI для PHP, входящая в состав официального дистрибутива PHP, начиная с версии 5.3.3. [258] По сравнению со старой реализацией FastCGI, он содержит некоторые дополнительные функции, в основном полезные для сильно нагруженных веб-серверов. [259]
При использовании PHP для сценариев командной строки необходим исполняемый файл интерфейса командной строки (CLI) PHP. PHP поддерживает интерфейс программирования приложений сервера CLI (SAPI), начиная с PHP 4.3.0. [260] Основное внимание в этом SAPI уделяется разработке приложений оболочки с использованием PHP. Между CLI SAPI и другими SAPI существует немало различий, хотя во многом они имеют одинаковое поведение. [261]
PHP имеет прямой интерфейс модуля под названием SAPI для различных веб-серверов; [262] в случае PHP 5 и Apache 2.0 в Windows он предоставляется в виде DLL- файла с именем php5apache2.dll , [263] который представляет собой модуль, который, помимо других функций, обеспечивает интерфейс между PHP и веб-сервером. , реализованный в форме, понятной серверу. Эта форма известна как SAPI. [ нужна цитата ]
Существуют разные виды SAPI для различных расширений веб-сервера. Например, в дополнение к перечисленным выше, другие SAPI для языка PHP включают интерфейс Common Gateway и интерфейс командной строки. [262] [264]
PHP также можно использовать для написания настольных приложений с графическим пользовательским интерфейсом (GUI) с помощью расширения PHP-GTK . PHP-GTK не включен в официальный дистрибутив PHP [257] и в качестве расширения его можно использовать только с версиями PHP 5.1.0 и новее. Самый распространенный способ установки PHP-GTK — это его компиляция из исходного кода. [265]
Когда PHP устанавливается и используется в облачных средах, предоставляются комплекты разработки программного обеспечения (SDK) для использования функций, специфичных для облака. [ нужна ссылка ] Например:
Поддерживаются многочисленные параметры конфигурации, влияющие как на основные функции PHP, так и на расширения. [268] [269] Файл конфигурации php.ini
ищется в разных местах, в зависимости от способа использования PHP. [270] Файл конфигурации разделен на различные разделы, [271] при этом некоторые параметры конфигурации также могут быть установлены в конфигурации веб-сервера. [272]
PHP — это язык сценариев общего назначения, который особенно подходит для серверной веб-разработки , и в этом случае PHP обычно запускается на веб-сервере . Любой код PHP в запрошенном файле выполняется средой выполнения PHP, обычно для создания динамического содержимого веб-страницы или динамических изображений, используемых на веб-сайтах или в других местах. [273] Его также можно использовать для сценариев командной строки и приложений с графическим интерфейсом пользователя (GUI) на стороне клиента . PHP можно развернуть на большинстве веб-серверов, во многих операционных системах и платформах , а также использовать со многими системами управления реляционными базами данных (СУБД). Большинство провайдеров веб-хостинга поддерживают PHP для использования своими клиентами. Он доступен бесплатно, и PHP Group предоставляет пользователям полный исходный код для создания, настройки и расширения для собственного использования. [17]
Первоначально разработанный для создания динамических веб-страниц , PHP теперь фокусируется в основном на написании сценариев на стороне сервера , [274] и он похож на другие языки сценариев на стороне сервера, которые передают динамический контент от веб-сервера клиенту , такие как Python , Microsoft . s ASP.NET , страницы JavaServer компании Sun Microsystems , [275] и . PHP также привлек внимание к разработке множества программных платформ , которые предоставляют строительные блоки и структуру проектирования для ускорения быстрой разработки приложений (RAD). [ нужна цитация ] Некоторые из них включают PRADO , CakePHP , Symfony , CodeIgniter , Laravel , Yii Framework , Phalcon и Laminas , предлагающие функции, аналогичные другим веб-фреймворкам .mod_perl
Архитектура LAMP стала популярной в веб-индустрии как способ развертывания веб-приложений. [276] PHP обычно используется как P в этом пакете наряду с Linux , Apache и MySQL , хотя P может также относиться к Python , Perl или их смеси. Аналогичные пакеты WAMP и MAMP также доступны для Windows и macOS , где первая буква обозначает соответствующую операционную систему. Хотя и PHP, и Apache включены в базовую установку macOS, пользователям этих пакетов нужен более простой механизм установки, который можно будет легче поддерживать в актуальном состоянии. [ нужна цитата ]
Для конкретных и более сложных сценариев использования PHP предлагает четко определенный и документированный способ написания пользовательских расширений на C или C++ . [277] [278] [279] [280] [281] [282] [283] [ необходим неосновной источник ] Помимо расширения самого языка в виде дополнительных библиотек , расширения предоставляют возможность повысить скорость выполнения там, где это необходимо. имеет решающее значение, и есть возможности для улучшений за счет использования настоящего компилируемого языка . [284] [285] PHP также предлагает четко определенные способы встраивания в другие программные проекты. Таким образом, PHP можно легко использовать в качестве внутреннего языка сценариев для другого проекта, обеспечивая при этом тесный интерфейс с конкретными внутренними структурами данных проекта . [286]
PHP получил неоднозначные отзывы из-за отсутствия поддержки многопоточности на уровне ядра языка, [287] хотя использование потоков стало возможным благодаря расширению PECL «pthreads» . [288] [289]
Были созданы интерфейс командной строки, php-cli и два скриптовых механизма ActiveX Windows Script Host для PHP. [ нужна цитата ]
Доля использования версий PHP на 23 февраля 2024 г.:
через три месяца после выпуска PHP 8.3 [18] [290] [291] [292] [293]
PHP используется для систем управления веб-контентом , включая MediaWiki , [294] WordPress , [295] Joomla , [296] Drupal , [297] Moodle , [298] eZ Publish , eZ Platform и SilverStripe . [299]
По состоянию на январь 2013 года [обновлять]PHP использовался более чем на 240 миллионах веб-сайтов (39% из выборки) и был установлен на 2,1 миллиона веб-серверов . [300]
По состоянию на 23 февраля 2024 г. [обновлять](через три месяца после выпуска PHP 8.3) PHP используется в качестве языка программирования на стороне сервера на 76,5% веб-сайтов, язык которых можно определить; PHP 7 является наиболее используемой версией языка: 58,1% веб-сайтов, использующих PHP, используют эту версию, 25,1% используют PHP 8, 16,6% используют PHP 5 и 0,2% используют PHP 4. [18]
В 2019 году 11% всех уязвимостей, перечисленных в Национальной базе данных уязвимостей, были связаны с PHP; [301] Исторически около 30% всех уязвимостей, перечисленных в этой базе данных с 1996 года, связаны с PHP. Технические недостатки безопасности самого языка или его основных библиотек встречаются нечасто (22 в 2009 году, около 1% от общего числа, хотя PHP применим примерно к 20% перечисленных программ). [302] Признавая, что программисты допускают ошибки, некоторые языки включают проверку на наличие ошибок для автоматического обнаружения отсутствия проверки ввода , что вызывает множество проблем. Такая функция разрабатывается для PHP, [303] но в прошлом ее включение в версию несколько раз отклонялось. [304] [305]
Существуют исправления расширенной защиты, такие как Suhosin и Hardening -Patch, специально разработанные для сред веб-хостинга. [306]
Исторически сложилось так, что старые версии PHP имели некоторые параметры конфигурации и значения по умолчанию для таких настроек времени выполнения, из-за которых некоторые приложения PHP были подвержены проблемам с безопасностью. Среди них magic_quotes_gpc
наиболее известны конфигурационные директивы register_globals
[307] ; последний превратил любые параметры URL-адреса в переменные PHP, открывая путь для серьезных уязвимостей безопасности, позволяя злоумышленнику устанавливать значение любой неинициализированной глобальной переменной и мешать выполнению PHP-скрипта. Поддержка настроек « магических кавычек » и «регистрации глобальных переменных» устарела, начиная с PHP 5.3.0, и удалена из PHP 5.4.0. [308]
Другой пример потенциальной уязвимости в настройках времени выполнения — невозможность отключить выполнение PHP (например, с помощью engine
директивы конфигурации) [309] для каталога, в котором хранятся загруженные файлы; его включение может привести к выполнению вредоносного кода, встроенного в загруженные файлы. [310] [311] [312] Лучше всего либо найти каталог изображений за пределами корня документа, доступного веб-серверу, и обслуживать его через промежуточный скрипт, либо отключить выполнение PHP для каталога, в котором хранятся загруженные файлы. [ нужна цитата ]
Кроме того, включение динамической загрузки расширений PHP (через enable_dl
директиву конфигурации) [313] в общей среде веб-хостинга может привести к проблемам с безопасностью. [314] [315]
Неявные преобразования типов , в результате которых разные значения рассматриваются как равные, иногда вопреки намерениям программиста, могут привести к проблемам безопасности. Например, результатом сравнения '0e1234' == '0'
является true
, поскольку строки, которые можно анализировать как числа, преобразуются в числа; в этом случае первое сравниваемое значение рассматривается как экспоненциальное обозначение , имеющее значение (0 × 10 1234 ), что равно нулю. Подобные ошибки приводили к уязвимостям аутентификации на Simple Machines Forum , [316] Typo3 [317] и phpBB [318] при сравнении хешей паролей MD5 . Рекомендуемый способ — использовать hash_equals() (для безопасности атаки по времени ) или оператор идентификации ( ), в результате чего получится . [319]strcmp
===
'0e1234' === '0'
false
В анализе более 170 000 дефейсов веб-сайтов , опубликованном Zone-H в 2013 году , наиболее часто (53%) используемым методом была эксплуатация уязвимости включения файлов , в основном связанная с небезопасным использованием конструкций языка PHP include
, require
и allow_url_fopen
. [320] [321]
По состоянию на 23 февраля 2024 г. [обновлять](через три месяца после выпуска PHP 8.3) W3Techs сообщает, что 85,32% веб-сайтов, использующих PHP, используют версии 8.0 или старше (которые больше не поддерживаются командой разработчиков PHP). [322] PHP версии 5 по-прежнему используется на 16,6% всех веб-сайтов. [291] Настоятельно рекомендуется перейти на PHP 8.1 или более позднюю версию и использовать random_int()
[323] вместо rand()
[324] или mt_rand()
, [325] , поскольку последние функции не являются криптографически безопасными. Существует две атаки, которые можно осуществить на источники энтропии PHP: «начальная атака» и «атака восстановления состояния». [ нужна ссылка ] С нынешним [ когда? ] GPU, злоумышленник может выполнять до 2 30 вычислений MD5 в секунду с помощью графического процессора стоимостью 250 долларов, а с дополнительными 500 долларами — до 2 32 вычислений. [326] В сочетании с « атакой на день рождения » это может привести к серьезным уязвимостям безопасности. [ нужна цитата ]
Если NaN и Infinity всегда становятся равными нулю при приведении к целому числу, это означает большую межплатформенную согласованность, а также менее удивительно, чем то, что происходит в настоящее время.
На полках лежат книги, посвященные PHP 6, по крайней мере, с 2008 года. Но в марте 2010 года версия PHP 6 еще не вышла – на самом деле, она даже не близка к выпуску.
Недавние события позволяют предположить, что PHP 6 не будет выпущен раньше 2011 года – если он вообще будет выпущен.
Последние версии PHP были частью серии выпусков 5.x, но PHP 6 не будет. «Мы собираемся пропустить [версию] 6, потому что много лет назад у нас были планы на 6, но эти планы были очень отличается от того, что мы делаем сейчас», — сказал Гутманс.
Переход сразу к версии 7 позволит избежать путаницы.
PHP — это язык программирования, на котором написан MediaWiki [...]
WordPress был [...] построен на PHP
SilverStripe требует PHP 5.3.2+.
{{cite web}}
: CS1 maint: числовые имена: список авторов ( ссылка )Какой абсолютный минимум я должен знать о PHP?