Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 21 марта 2023 года; проверки требуют 5 правок.
Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 21 марта 2023 года; проверки требуют 5 правок.
PHP
У этого термина существуют и другие значения, см. PHP (значения).
PHP (/pi:.eɪtʃ.pi:/англ.PHP: Hypertext Preprocessor — «PHP: препроцессоргипертекста»; первоначально PHP/FI (Personal Home Page / Form Interpreter), а позже названный Personal Home Page Tools[11] — «Инструменты для создания персональных веб-страниц») — C-подобныйскриптовый язык[12] общего назначения, интенсивно применяемый для разработки веб-приложений. В настоящее время поддерживается подавляющим большинством хостинг-провайдеров и является одним из лидеров среди языков, применяющихся для создания динамических веб-сайтов[13].
В области веб-программирования, в частности, серверной части, PHP — один из популярных сценарных языков (наряду с JSP, Perl и языками, используемыми в ASP.NET).
Популярность в области построения веб-сайтов определяется наличием большого набора встроенных средств и дополнительных модулей для разработки веб-приложений[15]. Основные из них:
Автоматическое извлечение POST- и GET-параметров, а также переменных окружения веб-сервера в предопределённые массивы;
По состоянию на 2022 год используется сотнями тысяч разработчиков; согласно рейтингу корпорации TIOBE, базирующемуся на данных поисковых систем, в декабре 2022 года PHP находился на 10 месте по популярности среди языков программирования[13].
Язык автоматически поддерживает HTTP Cookies в соответствии со стандартами Netscape. Это позволяет проводить установку и чтение небольших сегментов данных на стороне клиента. Работа с Cookies организована посредством сеансов (сессий). У сессий есть срок действия (после его истечения данные удаляются), в сессиях можно хранить и редактировать разные типы данных, в том числе сериализованные — пропущенные через serialize (процесс происходит автоматически), PHP-объекты.
PHP не ориентирован на создание десктопных приложений, но есть потребность в создании интерфейсов для настройки серверов, беспрерывного выполнения, отладки скриптов (сценариев), управления локальными и тестовыми серверами, и т. п. Из-за этого и возникли решения данной проблемы.
обёртки, использующие системные функции средствами FFI: Win32Std, Tk;
обёртки для использования интерфейса командной строки: PHP-UI, PHP-XCB.
Разработаны расширения, такие, как двусторонняя обёртка для использования других языков при написании расширений PHP, и наоборот. Например, PSV Component Library, — проект, состоящий из трёх подпроектов:
PHP4Delphi реализует соединения PHP с программами, написанными на Delphi средствами WinAPI; разрабатывался с 1999 года, но не обновлялся с 2009 года, из-за чего появились ответвления;
PHP extensions development framework — средство создания расширений PHP, VCL-компоненты — неотъемлемая часть PHP4Delphi, базовые компоненты которой нужны для создания приложений;
php4 Applications — расширение для использования PHP в других языках, базирующееся на PHP4Delphi, дающее доступ к макросам и упрощающее использование PHP, избавляя от создания обёртки.
Есть место и полноценным средам разработки для GUI PHP:
Dev PHP
Первопроходцем в этой категории является студия Dev PHP-IDE, которая использовала Kylix (Delphi) в качестве основы интерфейса и php-cli для создания пользовательских программ.
Она включала в себя редактор кода, несколько инструментов и визуальный просмотр HTML-страниц.
Впервые была представлена в 2002 году, сейчас имеет 3 стабильные версии, но разработка не продолжается — остановилась из-за гибели главного разработчика в автокатастрофе.
CodeGear Rad Studio (Расширение)
После DevPHP IDE появилось расширение — набор компонентов для CodeGear Rad Studio 2009 на базе php4delphi с некоторыми улучшениями (веб-элементы, инспектор, отладчик), поддержка её длилась в течение четырёх версий, вторая из которых вошла в платное расширение Rad Studio 2010: была возможность использовать скрипты, задавать стиль веб-компонентам, просматривать стили и веб-страницы до сборки программы, запускать локальный сервер, собирать программу, как отдельное приложение и отлаживать код. С выходом Delphi XE расширение получило название RADPHP Xe. Далее сама студия стала называться Embarcadero Delphi, и работа над данным расширением была приостановлена на неопределённый срок.
DevelStudio (RAD)
В 2009 году на базе php4delphi началась разработка среды для создания графических PHP-приложений, к разработке которой позже присоединился Ростислав Романов. Среда получила название PHP DevelStudio, первой опубликованной версией стала 0.1.7. DevelStudio имела небольшое количество компонентов в наборе инструментов и работала на устаревшем PHP 4. Во второй версии DevelStudio получила поддержку PHP 5. Были добавлены потоки, произведены множественные изменения и улучшения. Код сборки программ стал закрытым, предыдущие версии программы и сообщения на форуме были удалены с целью воспрепятствования злоумышленникам.
Вторая версия DevelStudio так же получила набор компонентов AlphaControls, вследствие чего её стали использовать для создания вредоносных программ в силу её простоты и понятности. Популярные на то время антивирусы (MacAffee, AVG, Avira) стали распознавать любые скомпилированные в DevelStudio программы как вирусы.
Через некоторое время автор AlphaControls обратился с жалобой к разработчикам DevelStudio, и набор компонентов был полностью удалён из среды, однако сохранился в уже существовавшей версии, удалить которую с форума в этот раз не представлялось возможным.
На момент 2012 года вышла последняя версия среды — 3.0.2, где появился новый набор компонентов, в том числе браузер Chromium вместо IE, что привлекло внимание веб-разработчиков и пользователей среды «Алгоритм». На тот момент компиляция программ в «Алгоритме» была платной, поэтому DevelStudio как новая и бесплатная среда разработки переманила на себя бо́льшую часть аудитории.
В 2014 году начались первые попытки по восстановлению среды, в этот раз со стороны сообщества. В конце 2018 года исходный код был восстановлен и доступен в GitHub.
В 2019 году сообщество обратилось к создателю DevelStudio с целью изменения политики распространения среды, вследствие чего она стала доступной для обновления и редактирования. Из-за жалоб на отсутствие ссылок на использованные библиотеки (DCEF, PHP4Delphi, TSizeCtrl, SynEdit) форум был удалён, а одна из страниц с описанием среды была перенаправлена на главную страницу сайта. С этого момента DevelStudio официально принадлежит сообществу.
DevelNext (DN)
Параллельно с этим главный разработчик DevelStudio начал создавать «реинкарнацию» предыдущей среды. Он взял за основу графическую библиотеку JavaFX, в результате вышла полностью новая среда, с поддержкой CSS, но без полной поддержки библиотеки Zend PHP — проект был основан на собственном языке jPHP. Его особенностью является, работа на JVM, JIT-компилятор, поддержка юникода, многопоточность и объектно-ориентированная стандартная библиотека.
В 16-й версии среда DevelNext получила поддержку php 7, а параллельно с этим jPHP был расширен энтузиастом для разработки под ОС Android.
На данный момент автор и энтузиасты трудятся над 2020 версией (ранее 17-я).
PHPQt
В 2015 году Александр Казанцев начал изучать алгоритмы разработки интерфейсов и создал расширение php_qml, что давало возможность использовать виджеты из библиотеки QT, но работало оно только под Windows.
С этого началась разработка PHPQt, первые версии не обратили особого внимания со стороны веб-разработчиков, поэтому автор начал углублённо улучшать расширение.
28 июля 2015 года был опубликован первый вариант компилятора проектов, на тот момент это был простой исполнитель скриптов(сценариев), который прикреплял php-код к стабу (подобно DevelStudio), и имел зависимость от Windows API, на этой стадии поддерживались уже почти все виджеты и многопоточность, была лёгкая оптимизация php-кода. С этого момента движок стали называть PQEngine,
3 августа 2016 года вышла пятая версия компилятора приложений (PqBuilder), что перешёл на базу PlastiQ и имел поддержку уже новейшего, на тот момент, php 7, проекты получили более полноценный компилятор и уже не требовали наличия PqEngine.dll вблизи с исполняемым файлом, вместо этого визуальные библиотеки стали добавляться динамично — как файлы, а не вшиваться в PQEngine.dll. Такой шаг был предпринят для совместимости с другими системами и оригинальными библиотеками Qt.
С появлением шестой версии проект стал дополнением для среды Qt Creator, а компилятор стал всего-навсего оптимизатором кода перед конечной сборкой программы. Появился полноценный редактор интерфейса, подсказки в редакторе кода и начала создаваться документация. С этого момента сделали анонс про создание среды PqStudio, но её разработка не зашла далеко.
WinForms PHP
В 2018 году появился проект, объединяющий возможности Windows Forms (.NET Framework) и PHP 7. Его разработка медленными темпами ведётся и сейчас[когда?]. На текущий момент в движке доступны практически все[какие?] функции для ООП. Среда находится на стадии приватной разработки. К исполняемому файлу по умолчанию прилагается php7ts.dll.
Также существуют расширения и для противоположного применения — подключения PHP к проекту на другом языке программирования: Phalanger (C#, php с 5.4 по 7), Peachpie] (C#, php 7), PHP4Delphi (Lazarus, Delphi, C#, C, C++, php 5.6, JPHP (Java, php 7.0), PHPly (Python, php 5.6)
В 1994 годудатскийпрограммистРасмус Лердорф разработал на C[16] набор CGI-скриптов для учёта посетителей его онлайн-резюме, обрабатывающий шаблоны HTML-документов. Лердорф назвал набор Personal Home Page Tools (Инструменты для личной домашней страницы). Вскоре функциональности перестало хватать, и Лердорф разработал новый интерпретатор шаблонов PHP/FI (англ.Personal Home Page / Forms Interpreter — «персональная домашняя страница / интерпретатор форм»)[17].
8 июня 1995 года вышел Personal Home Page (PHP Tools) version 1.0 — первый публичный релиз.
В 1997 году после длительного бета-тестирования вышла вторая версия обработчика, написанного на C — PHP/FI 2.0. Её использовали около 1 % (приблизительно 50 тысяч) всех интернет-доменов мира[11].
Версия PHP 3.0 подверглась значительной переработке, определившей современный облик и стиль языка программирования. В 1997 году два израильских программиста, Энди Гутманс и Зеев Сураски, полностью переписали код интерпретатора. PHP 3.0 был официально выпущен в июне 1998 года[11].
Одной из сильнейших сторон PHP 3.0 была возможность расширения ядра дополнительными модулями. Впоследствии интерфейс написания расширений привлёк к PHP множество сторонних разработчиков, работающих над своими модулями, что дало PHP возможность работать с огромным количеством баз данных, протоколов, поддерживать большое число API. Большое количество разработчиков привело к быстрому развитию языка и стремительному росту его популярности. С этой версии акронимphp расшифровывается как «PHP: hypertext Preprocessor», вместо устаревшего «Personal Home Page».
К зиме 1998 года, практически сразу после официального выхода PHP 3.0, Энди Гутманс и Зеев Сураски начали переработку ядра PHP. В задачи входило увеличение производительности сложных приложений и улучшение модульности базиса кода PHP. Новый движок, названный Zend Engine, успешно справлялся с поставленными задачами и впервые был представлен в середине 1999 года.
PHP 4.0, основанный на этом движке и принёсший с собой набор дополнительных функций, официально вышел в мае 2000 года. В дополнение к улучшению производительности, PHP 4.0 имел ещё несколько ключевых нововведений, таких как поддержка сессий, буферизация вывода, более безопасные способы обработки вводимой пользователем информации и несколько новых языковых конструкций.
Пятая версия PHP была выпущена разработчиками 13 июля2004 года. Изменения включают обновление ядра Zend (Zend Engine 2), что существенно увеличило эффективность интерпретатора. Введена поддержка языка разметки XML. Полностью переработаны функции ООП, которые стали во многом схожи с моделью, используемой в Java. В частности, введён деструктор, открытые, закрытые и защищённые члены и методы, окончательные члены и методы, интерфейсы и клонирование объектов.
В последующих версиях также были введены пространства имён, замыкания и целый ряд достаточно серьёзных изменений, количественно и качественно сравнимых с теми, которые появились при переходе на PHP 5.0.
Шестая версия PHP разрабатывалась с октября 2006 года[18]. Было сделано множество нововведений[19][20], как, например, исключение из ядра регулярных выражений POSIX и «длинных» суперглобальных массивов, удаление директив safe_mode, magic_quotes_gpc и register_globals из конфигурационного файла php.ini. Одним из основных новшеств должна была стать поддержка Юникода[21]. Однако в марте 2010 года разработка PHP6 была признана бесперспективной[22] из-за сложностей с поддержкой Юникода. Исходный код PHP6 перемещён на ветвь, а основной линией разработки стала версия 5.4.
В 2014 году было проведено голосование, по результатам которого следующая версия получила название PHP 7[23]. Выход новой версии планировался в середине октября 2015 года[24]. В марте 2015 года Zend представили инфографику, в которой описаны основные нововведения PHP 7[25].
Новая версия основывается на экспериментальной ветви PHP, которая изначально называлась phpng (англ.PHP Next Generation «следующее поколение»), и разрабатывалась с упором на увеличение производительности и уменьшение потребления памяти[27]. В новой версии добавлена возможность указывать тип возвращаемых из функции данных[28], добавлен контроль передаваемых типов для данных[29], а также новые операторы.
13 июня 2019 вышла версия PHP 7.4. В ядро были добавлены типизированные свойства и стрелочные функции, а также ограниченная ковариантность возвращаемого типа и контравариантность типа аргумента[30].
PHP версии 8.0 была выпущена 26 ноября 2020-го[31]. Главными нововведениями стали[32]: поддержка union-типов[33], JIT-компиляция[34] и атрибуты (также известны как аннотации), также «конструкция» switch была заменена на «выражение» match и был добавлен новый оператор Nullsafe.
9 июля 2020 года Дэйл Хирт (англ.Dale Hirt), менеджер проекта PHP в Microsoft, в рассылке php.internals выпустил сообщение[35] о том, что после выпуска версии PHP 8.0 Microsoft прекратит поддержку разработки этого языка программирования для Windows[36]. Специалисты Microsoft занимались компиляцией бинарных версий интерпретатора для ОС Windows и тестированием их безопасности. В сообществе разработчиков PHP сообщили, что примут все необходимые меры, чтобы найти в ближайшее время альтернативный вариант для организации поддержки PHP 8.0 и выше для Windows, например, своими силами[37].
Лексический анализ PHP осуществляется посредством утилиты re2c[38][39],
утилита генерирует быстрые и легко встраиваемые лексеры.
Для написания простейшего скрипта не требуется описывать какие-либо переменные, используемые модули и т. п. Любой скрипт может начинаться непосредственно с оператора <?php.
Также возможен более короткий вариант вывода строки:
<?='Hello, world!'?>
Открывающий тег вида <?= используется для сокращённой записи конструкций, используемых для вывода строки.
PHP исполняет код, находящийся внутри ограничителей, таких как <?php ?>. Всё, что находится вне ограничителей, выводится без изменений. В основном это используется для вставки PHP-кода в HTML-документ, например, так:
Помимо ограничителей <?php ?>, допускается (но признано устаревшим и практически не используется) использование сокращённого варианта <? ?>. Кроме того, до версии 7.0 допускалось использование ограничителей языка программирования ASP<% %> и <script language="php"> </script>. Работа сокращённых конструкций определяется в конфигурационном файле php.ini.
Имена переменных начинаются с символа $, тип переменной объявлять не нужно. Имена переменных и констант чувствительны к регистру символов. Имена классов, методов классов и функций к регистру символов не чувствительны. Переменные обрабатываются в строках, заключённых в двойные кавычки, и heredoc-строках (строках, созданных при помощи оператора <<<). Переменные в строках, заключённых в одинарные кавычки и nowdoc не обрабатываются.
Инструкции разделяются с помощью точки с запятой (;), за исключением некоторых случаев, после объявления конструкции if/else и циклов.
Переменные в функцию можно передавать как по значению, так и по ссылке (используется знак &).
PHP поддерживает три типа комментариев: в стиле языка Си (ограниченные /* */), C++ (начинающиеся с // и идущие до конца строки) и оболочки UNIX (с # до конца строки).
PHP является языком программирования с динамической типизацией, не требующим указания типа при объявлении переменных, равно как и самого объявления переменных.
Диапазон целых чисел (int) в PHP зависит от платформы (для 32-битной архитектуры диапазон числа не превышает int32_t, то есть, от −2 147 483 648 до 2 147 483 647). Числа можно задавать в десятичной, восьмеричной и шестнадцатеричной системах счисления. Диапазон вещественных чисел (float) также зависит от платформы (для 32-битной архитектуры диапазон позволяет оперировать числами от ±1.7×10−308 до ±1.7×10+308).
PHP предоставляет разработчикам логический тип (bool), способный принимать только два значения true («истина») и false («ложь»). При преобразовании в логический тип число 0, пустая строка, ноль в строке «0», null и пустой массив считаются равными false. Все остальные значения автоматически преобразуются в true.
Специальный тип null предназначен для переменных без определённого значения. Единственным значением данного типа является литерал null. Тип null принимают неинициализированные переменные, переменные инициализированные константой null, а также переменные, удалённые при помощи конструкции unset().
Ссылки на внешние ресурсы имеют тип «ресурс» (resource). Переменные данного типа, как правило, представляют собой дескриптор, позволяющий управлять внешними объектами, такими как файлы, динамические изображения, результирующие таблицы базы данных и т. п. По мере развития языка стандартная библиотека постепенно дорабатывается и ресурсы заменяются объектами. Таким образом планируется полностью избавиться от этого типа.
Массивы (array) поддерживают числовые и строковые ключи и являются гетерогенными. Массивы могут содержать значения любых типов, включая другие массивы. Порядок элементов и их ключей сохраняется. Не совсем корректно называть php-массивы массивами, на самом деле это, скорее всего, упорядоченный хеш. Возможно неожиданное поведение при использовании цикла for со счётчиком вместо foreach. Так, например, при сортировке массива с численными индексами функциями из стандартной библиотеки, сортируются и ключи тоже.
Язык допускает типизацию аргументов, возвращаемых значений функций и методов классов, а также, начиная с версии 7.4 типизацию полей классов. Включение строгого режима отключает неявные преобразования типов в данных участках кода, что приближает поведение языка к языкам со строгой типизацией.
Типы int, string, float, bool, array или object являются допустимыми определениями типа аргумента, поля класса или возвращаемого значения. Также допускается использовать имена классов, либо интерфейсов для определения конкретной реализации. Использованиеresource для определения типа не допускается, а указание null возможно с ограничениями: Только в рамках определения типа-суммы, например int|null (либо ?int).
Современный PHP реализует базовую поддержку алгебраических типов данных и позволяет использовать как конъюнкцию, так и дизъюнкцию при определении типа. Язык не позволяет использовать псевдонимы типов, однако предоставляет несколько встроенных реализаций, которые в рамках PHP именуются «псевдотипами». Подобный термин в языке применяется к любому определению типа, который не является самостоятельным, применимым к значению, а реализован лишь как инструкция проверки типа в Zend VM.
never возвращаемый тип, означающий прерывание работы приложения
self тип, ссылающийся на класс в рамках которого данный тип был использован (можно использовать псевдонимы parent или static, но последний только в качестве возвращаемого)
false тип (часть bool), который можно использовать только в качестве одного из элементов так называемого юнион типа, например int|false
Помимо проверок на соответствие типам встроенные «псевдотипы» могут реализовывать дополнительную логику проверок. Например, callable тип может быть представлен:
строкой, которая должна содержать имя функции;
массивом где нулевой и первый элемент — строки (интерпретируется как название статической функции класса);
массивом где нулевой элемент — объект, а первый — строка (интерпретируется как метод у объекта).
Стоит обратить внимание, что в случае анонимных функций различие состоит не только в визуальных отличиях, но и в способе захвата переменных внешнего контекста. Любая «короткая» форма записи является замыканием, в то же время длинная запись для реализации замыкания требует явного указания переменных внутри оператора use из внешнего контекста для их захвата:
$variable='Hello World!';// Использование оператора usefunction()use($variable):string{return$variable;};// Альтернативный вариант, используя короткий синтаксисfn():string=>$variable;
Обращение к переменным осуществляется с помощью символа $, за которым следует имя переменной. Данная конструкция может быть применена также для создания динамических переменных и функций.[41] Например:
$a='I am a';// Запись значения в переменную $aecho$a;// Вывод переменной $а$b='a';echo$$b;// Вывод переменной $а (дополнительный $ перед переменной $b)echo${'a'};// Вывод переменной $afunction_name();// Вызов функции function_name$c='function_name';$c();//Вызов функции function_name$d='ClassName';$obj=newClassName;// Создание объекта класса ClassName$obj=new$d();// Создание объекта класса ClassName$obj->b;// Обращение к свойству b объекта$obj->c();// Вызов метода c() объекта$obj->$b;// Обращение к свойству a объекта, так как $b = 'a'$obj->$c();// Вызов метода function_name() объекта, так как $c = 'function_name'
В PHP echo и print хоть и выглядят похоже на функции, однако первое является оператором[42], а второе выражением (то есть print возвращает значение, в отличие от echo). При их использовании можно опустить скобки.
Суперглобальными массивами (англ.Superglobal arrays) в PHP называются предопределённые массивы, имеющие глобальную область видимости без использования директивы global. Большая часть этих массивов содержит входные данные запроса пользователя (параметры GET-запроса, поля форм при посылке методом POST, куки и т. п.).
Все суперглобальные массивы, кроме $GLOBALS и $_REQUEST, имеют устаревшие аналоги с длинными именами, которые доступны вплоть до версии 5.3. х (начиная с 5.4.0 были удалены). Таким образом, обращения $_GET['year'] и $HTTP_GET_VARS['year'] идентичны (за исключением области видимости: массивы с «длинными» именами не являются суперглобальными).
$GLOBALS
Массив всех глобальных переменных (в том числе и пользовательских).
$_SERVER (аналог для устаревшего — $HTTP_SERVER_VARS)
Содержит переменные окружения, которые операционная система передаёт серверу.
$_ENV (уст. $HTTP_ENV_VARS)
Текущие переменные среды (англ.Environment variables). Их набор специфичен для платформы, на которой выполняется скрипт.
$_GET (уст. $HTTP_GET_VARS)
Содержит параметры GET-запроса, переданные в URI после знака вопроса «?».
$_POST (уст. $HTTP_POST_VARS)
Ассоциативный массив значений полей HTML-формы при отправке методом POST. Индексы элементов соответствуют значению свойства name объектов (кнопки, формы, радиокнопки, флажки и т. д.) HTML-формы.
$_FILES (уст. $HTTP_POST_FILES)
Ассоциативный массив со сведениями об отправленных методом POST файлах. Каждый элемент имеет индекс, идентичный значению атрибута «name» в форме, и, в свою очередь, также является массивом со следующими элементами:
['name'] — исходное имя файла на компьютере пользователя.
['type'] — указанный агентом пользователя MIME-тип файла. PHP не проверяет его, и поэтому нет никаких гарантий, что указанный тип соответствует действительности.
['size'] — размер файла в байтах.
['tmp_name'] — полный путь к файлу во временной папке. Файл необходимо переместить оттуда функцией move_uploaded_file. Загруженные файлы из временной папки PHP удаляет самостоятельно.
['error'] — код ошибки. Если файл удачно загрузился, то этот элемент будет равен 0 (UPLOAD_ERR_OK).
$_COOKIE (уст. $HTTP_COOKIE_VARS)
Ассоциативный массив с переданными агентом пользователя значениями куки.
$_REQUEST
Содержит элементы из массивов $_GET, $_POST, $_COOKIE. С версии PHP 4.1 включает $_FILES.
Ключевое слово class было зарезервировано ещё в третьей версии языка.
В четвёртой версии стало возможно создавать классы и объекты на их основе. Однако принципы ООП поддерживались лишь частично, так например, все члены (переменные и методы) были открыты. К тому же создание объектов было дорогой операцией и работало медленно.
Начиная с пятой версии PHP обладает полной поддержкой ООП. Работа с классами была оптимизирована и теперь такой код работает достаточно быстро.
Класс в PHP объявляется с помощью ключевого слова class. Методы и свойства класса могут быть общедоступными (public, по умолчанию), защищёнными (protected) и скрытыми (private). PHP поддерживает все три основных механизма ООП — инкапсуляцию, полиморфизм подтипов и наследование (родительский класс указывается с помощью ключевого слова extends после имени класса). Поддерживаются интерфейсы (ставятся в соответствие с помощью implements). Разрешается объявление финальных, абстрактных методов и классов. Множественное наследование классов не поддерживается, однако класс может реализовывать несколько интерфейсов. Для обращения к методам родительского класса используется ключевое слово parent.
Начиная с версии 5.4.0 множественное наследование может быть реализовано с помощью механизма особенностей (англ.trait). Особенности похожи на примеси (англ.mixins), за исключением того что для них нельзя напрямую создать экземпляр. Повторное использование кода заключено в использовании кода особенности в нескольких классах. Допускается использовать в одном классе несколько особенностей. Механизм особенностей имеет средства разрешения конфликтов имён. При запуске программы код особенности будет «вкомпилирован» в код содержащего его класса.
Классы в PHP имеют ряд «магических» методов (англ.magic methods), начинающихся с двух символов подчёркивания — конструктор (__construct(), в версиях до 5.0 конструктором служил метод, одноимённый с классом) и деструктор (__destruct()), а также методы чтения (__get()) и записи (__set()), свёртывания (__sleep()) и развёртывания (__wakeup()), клонирования (__clone()) и др. Эти методы являются достаточно гибким инструментом: переопределяя их, можно добиться существенного изменения поведения объекта.
Все функции-члены реализованы виртуальными и потому все они являются методами.
Экземпляры класса создаются с помощью ключевого слова new, обращение к свойствам и методам объекта производится с использованием оператора ->. Для доступа к членам класса из его методов используется переменная $this.
Начиная с пятой версии PHP объекты передаются по ссылке:
classA{public$color='red';}$a=newA();echo$a->color;// red$b=$a;$b->color='blue';echo$a->color;// blue
«Paamayim Nekudotayim» (иврит: פעמיים נקודתיים) или просто «двойное двоеточие». Используя эту лексему, программист может обращаться к константам, статическим или перегруженным свойствам или методам класса.
При обращении к этим элементам извне класса программист должен использовать имя этого класса.
«Paamayim Nekudotayim» на первый взгляд может показаться странным словосочетанием для обозначения двойного двоеточия. Однако во время создания Zend Engine версии 0.5 (который входил в PHP3), Andi и Zeev выбрали[43] именно это обозначение. «Paamayim Nekudotayim» действительно значит «двойное двоеточие» (дословно: «два раза двоеточие») на иврите. Это обозначение не менялось ни разу в течение всего времени разработки PHP[44].
classMyClass{publicconstCONST_VALUE='Значение константы';}// Использование :: вне объявления классаechoMyClass::CONST_VALUE;
выполнение опкода интерпретатором (без создания исполняемого файла), либо JIT-компиляция результата с последующим выполнением (для включения JIT требуется специальный флаг в настройках интерпретатора).
Раньше, для увеличения быстродействия приложений было возможно использование специального программного обеспечения, так называемых акселераторов. Принцип их работы заключается в кэшировании однажды сгенерированного байт-кода в памяти и/или на диске, таким образом, из процесса работы приложения исключаются этапы 1—3, что в общем случае ведёт к значительному ускорению работы. Начиная с версии 5.5 одна из разновидностей акселераторов, opcache, была встроена в ядро, поэтому сторонние решения больше не пользуются популярностью.
Важной особенностью является то, что разработчику нет необходимости заботиться о распределении и освобождении памяти. Ядро PHP реализует средства для автоматического управления памятью; вся выделенная память возвращается системе после завершения работы скрипта[45].
Интерпретатор состоит из ядра и подключаемых модулей, «расширений», представляющих собой динамические библиотеки. Расширения позволяют дополнить базовые возможности языка, предоставляя возможности для работы с базами данных, сокетами, динамической графикой, криптографическими библиотеками, документами формата PDF и тому подобным. Любой желающий может разработать своё собственное расширение и подключить его. Существует огромное количество расширений, как стандартных, так и созданных сторонними компаниями и энтузиастами, однако в стандартную поставку входит лишь несколько десятков хорошо зарекомендовавших себя. Множество расширений доступно в репозитории PECL.
Начиная с версии 7.4.0 в PHP была добавлена поддержка FFI, что в значительной степени упростило взаимодействие с библиотеками, написанными на любом другом языке (включая API, предоставляемое операционной системой). Этот новый функционал, в свою очередь, предоставил альтернативу написанию расширений. Таким образом, используя FFI можно писать код на языке PHP и взаимодействовать с любыми библиотеками в системе, которые предоставляют cdecl, fastcall или stdcallABI.
Интерпретатор PHP имеет специальный конфигурационный файл — php.ini, содержащий множество настроек, изменение которых влияет на поведение интерпретатора[46]. Имеется возможность отключить использование ряда функций, изменить ограничения на используемую скриптом оперативную память, время выполнения, объём загружаемых файлов, настроить журналирование ошибок, работу с сессиями и почтовыми сервисами, подключить дополнительные расширения, а также многое другое. Возможно дробление большого конфигурационного файла на части. Например, широко распространена практика вынесения настроек расширений в отдельные файлы. Параметры интерпретатора могут быть переопределены в файлах конфигурации HTTP-сервера (например, .htaccess в Apache) или в самом скрипте во время выполнения при помощи команды ini_set[47].
SAPI — это внешний уровень абстракции, предназначенный для встраивания интерпретатора в другие приложения и отвечает за его работу (запуск, остановка, передача скриптов на исполнение, доступ к внешним данным). Существует несколько основных SAPI, определяющих способы запуска и использования PHP:
В качестве модуля к веб-серверу (например, для Apache модуль mod_php). В этом случае интерпретатор PHP выполняется в окружениипроцесса веб-сервера. Веб-сервер управляет количеством запущенных процессов PHP и сообщает им, какие скрипты требуется исполнить.
CGI SAPI. Использование CGI подразумевает запуск нового процесса для обработки каждого запроса. Для исполнения PHP-скрипта веб-сервер запускает ./php-cgi /path/to/script.php . Сам принцип такого использования подразумевает, что интерпретатор PHP исполняет только один скрипт, после чего заканчивает свою работу. Затраты на запуск процесса интерпретатора и его инициализацию очень часто сопоставимы или даже превышают затраты на исполнение PHP-скрипта. Для решения этой проблемы в CGI SAPI был введён режим FastCGI. В этом режиме PHP-интерпретатор запускается как независимый сервер, обрабатывающий входящие запросы на исполнение PHP-скриптов по протоколу FastCGI, что позволяет ему работать с любым веб-сервером, поддерживающим этот протокол.
FPM SAPI, известный как php-fpm — это другая реализация протокола FastCGI. Создан изначально Андреем Нигматулиным как отдельный патч для использования в социальной сети Badoo. Данная реализация решала ряд проблем, которые мешали использованию CGI/FastCGI SAPI. В частности, появилась возможность перезапуска пула интерпретаторов PHP без потери запросов, запуск нескольких пулов под разными пользователями, аварийный перезапуск интерпретаторов в случае проблем с ними и ещё несколько приятных дополнений. В дальнейшем над патчем работали несколько человек, был добавлен режим динамического управления числом запущенных процессов PHP (по принципу управления числом процессов в веб-сервере Apache), и начиная с версии PHP 5.3.3 php-fpm был включён в PHP как отдельное SAPI.
Начиная с версии PHP 5.4.0 в CLI SAPI появилась возможность запуска PHP как отдельного HTTP-сервера. Однако этот режим предназначен исключительно для разработки, так как запускает только один процесс интерпретатора и выполняет все запросы исключительно последовательно.
В силу популярности языка PHP и желания увеличить быстродействие основанных на нём веб-приложений создано несколько альтернативных компиляторов, близких к PHP-языку. Так в феврале 2010 года компания Facebook открыла[50][51] свой компилятор PHP — HipHop (HPHP, Hyper-PHP) генерирующий код на C++, с последующей компиляцией в машинный код с помощью gcc. В июле 2013 года российская компания ВКонтакте анонсировала похожий продукт — KPHP[52].
В таблице представлен список существующих на сегодняшний момент альтернативных реализаций.
Стандартные рекомендации PHP (англ.PHP Standard Recommendation, сокр. PSR) — это спецификация PHP, которая разрабатывается, принимается и публикуется группой авторитетных PHP проектов в том числе
CakePHP, Composer, Joomla, PEAR, Phalcon, phpDocumentor, TYPO3, Yii framework[61]. Спецификация служит стандартизацией концепций программирования на языке PHP и основана на реальном опыте, а также на исследованиях и экспериментах[62]. Цель рекомендаций состоит в том, чтобы обеспечить совместимость компонентов веб-приложений разработанных разными разработчиками.
Сторонники языка PHP в качестве основных его преимуществ называют широкую распространённость, востребованность PHP-разработчиков на рынке труда и простоту изучения. К достоинствам языка относится и его достаточно быстрая эволюция.
Отсутствие поддержки многобайтовых кодировок в ядре языка[править | править код]
Поддержка строк с многобайтовыми кодировками (такими как UTF-8) реализуется через отдельные расширения mbstring и iconv, на уровне ядра поддержка отсутствует, однако с версии PHP 4.2.0 есть возможность переопределять стандартные функции работы со строками, подменяя их на аналоги из mbstring.
Поддержка многобайтовых кодировок во всех строковых функциях стала доступна с версии 5.4.0 (март 2012 года).
В языке не предусмотрена возможность создания многопоточных приложений и отсутствует поддержка синхронизированного доступа к ресурсам, однако реализуема при помощи расширения PCNTL[63] (от англ.process control), но оно не подходит для решения специфических задач.
Хотя есть возможность установить расширение pthreads для «честных» потоков, но для этого интерпретатор должен быть скомпилирован с флагом thread safety, а само расширение признано устаревшим в пользу parallel (от того же автора).
В качестве более современной альтернативы возможно использование расширения Swoole.
↑По-видимому, позаимствовали из языка C++, где это бинарная форма указания области видимости, конструкция с ним, квалифицированным именем, в данном случае константы.
Мэтт Зандстра. PHP: объекты, шаблоны и методики программирования = PHP Objects, Patterns and Practice, Third Edition. — 3-е издание. — М.: «Вильямс», 2010. — С. 560. — ISBN 978-5-8459-1689-1.
Кристиан Дари, Эмилиан Баланеску. PHP и MySQL: создание интернет-магазина = Beginning PHP and MySQL E-Commerce: From Novice to Professional. — М.: «Вильямс», 2010. — ISBN 978-5-8459-1602-0.
Джейсон Ленгсторф. PHP и jQuery для профессионалов = Pro PHP and jQuery. — М.: «Вильямс», 2010. — С. 352. — ISBN 978-5-8459-1693-8.
Квентин Зервас. Web 2.0: создание приложений на PHP = Practical Web 2.0 Applications with PHP. — М.: «Вильямс», 2009. — С. 544. — ISBN 978-5-8459-1590-0.
Кузнецов Максим, Симдянов Игорь. PHP 5/6. — СПб.: «БХВ-Петербург», 2009. — С. 1024. — ISBN 978-5-9775-0304-4.
Кузнецов Максим, Симдянов Игорь. Объектно-ориентированное программирование на PHP. — СПб.: «БХВ-Петербург», 2007. — С. 608. — ISBN 978-5-9775-0142-2.
Эд Леки-Томпсон, Алек Коув, Стивен Новицки, Хьяо Айде-Гудман. PHP 5 для профессионалов = Professional PHP 5. — М.: «Диалектика», 2006. — С. 608. — ISBN 0-7645-7282-2.
Кузнецов Максим, Симдянов Игорь. Самоучитель PHP 5/6. — 3-е изд., перераб. и доп. — СПб.: «БХВ-Петербург», 2009. — С. 672. — ISBN 978-5-9775-0409-6.
Кузнецов Максим, Симдянов Игорь. PHP. Практика создания Web-сайтов. — 2-е изд. перераб. и доп. — СПб.: «БХВ-Петербург», 2008. — С. 1264. — ISBN 978-5-9775-0203-0.
Кузнецов Максим, Симдянов Игорь. Головоломки на PHP для хакера. — 2-е изд. перераб. и доп. — СПб.: «БХВ-Петербург», 2008. — С. 544. — ISBN 978-5-9775-0204-7.
Кузнецов Максим, Симдянов Игорь. PHP на примерах. — 2-е изд. перераб. и доп. — СПб.: «БХВ-Петербург», 2011. — С. 400. — ISBN 978-5-9775-0445-4.
Люк Веллинг, Лора Томсон. Разработка веб-приложений с помощью PHP и MySQL. — 5-е изд.. — СПб.: «Диалектика», 2019. — С. 768. — ISBN 978-5-9908911-9-7.
Luke Welling, Laura Thomson. PHP & MySQL Web Development. — fifth edition. — «Addison-Wesley», 2017. — С. 687. — ISBN 978-0-321-83389-1.
Зандстра М. PHP. Объекты, шаблоны и методики программирования. — 4-е изд.. — СПб.: «Диалектика», 2015. — С. 576. — ISBN 978-5-8459-1922-9.
Зандстра М. PHP. Объекты, шаблоны и методики программирования. — 5-е изд.. — СПб.: «Диалектика», 2019. — С. 736. — ISBN 978-5-907144-54-5.
Никсон Р. Создаём динамические веб-сайты с помощью PHP, MySQL, JavaScript, CSS и HTML5. — 4-е изд.. — СПб.: «Бестселлеры O’Reilly», 2016. — С. 768. — ISBN 978-5-496-02146-3.
Ульман,Ларри. РНР и MySQL: создание интернет-магазинов. — 2-е изд.. — СПб., 2015. — С. 544. — ISBN 978-5-8459-1939-7.
Кузнецов М., Симдянов И. Самоучитель PHP 7. — 2-е изд.. — СПб., 2018. — С. 448. — ISBN 978-5-9775-3817-6.