PHP: различия между версиями
imported>VitalikBot м Использование шаблона {{improve}}; langs: de |
Правка орфографических и пунктуационных ошибок. |
||
| Строка 1: | Строка 1: | ||
{{ | {{значения|PHP (значения)}} | ||
= {{- | {{Карточка языка программирования | ||
| последняя версия = 8.5.4 | |||
| дата выпуска последней версии = 12.03.2026 | |||
}} | |||
'''PHP''' ({{lang-en|PHP: Hypertext Preprocessor}} — «PHP: [[препроцессор]] [[гипертекст]]а»; первоначально PHP/FI (Personal Home Page / Form Interpreter), а позже названный {{lang-en2|Personal Home Page Tools}}<ref name="off_history">{{Cite web |url=http://php.net/manual/en/history.php.php |title=PHP: History of PHP — Manual |access-date=2009-01-18 |archive-date=2009-02-01 |archive-url=https://web.archive.org/web/20090201023730/http://php.net/manual/en/history.php.php |url-status=live }}</ref> — «Инструменты для создания персональных веб-страниц») — [[скриптовый язык]]<ref>{{cite web|url=http://www.php.net/manual/en/preface.php |title=PHP: Preface — Manual |lang=en |archive-url=https://www.webcitation.org/616XiJbXc?url=http://www.php.net/manual/en/preface.php |archive-date=2011-08-21 }}</ref> общего назначения, интенсивно применяемый для разработки веб-приложений. В настоящее время поддерживается подавляющим большинством [[хостинг|хостинг-провайдеров]] и является одним из лидеров среди языков, применяющихся для создания [[Динамический сайт|динамических веб-сайтов]]<ref name="tiobe">{{Cite web|lang=en|url=https://www.tiobe.com/tiobe-index/|title=TIOBE Index for December 2022|archive-url=https://web.archive.org/web/20221212204559/https://www.tiobe.com/tiobe-index/|archive-date=2022-12-12|access-date=2022-12-14|url-status=live}}</ref>. | |||
Язык и его интерпретатор ([[Zend Engine]]) разрабатываются группой энтузиастов в рамках проекта с [[Открытое программное обеспечение|открытым кодом]]<ref>{{cite web | |||
|url = http://www.php.net/manual/en/history.php#history.php4 | |||
|title = History of PHP and related projects | |||
|lang = en | |||
|archive-url = https://www.webcitation.org/616XiuLEr?url=http://www.php.net/manual/en/history.php#history.php4 | |||
|archive-date = 2011-08-21 | |||
}}</ref>. Проект распространяется под [[Лицензия PHP|собственной лицензией]], несовместимой с [[GNU GPL]]. | |||
== Область применения == | |||
В области веб-программирования, в частности, серверной части, PHP — один из популярных [[Скриптовый язык|сценарных языков]] (наряду с [[JSP]], [[Perl]] и языками, используемыми в [[ASP.NET]]). | |||
Популярность в области построения [[веб-сайт]]ов определяется наличием большого набора встроенных средств и дополнительных модулей для разработки веб-приложений<ref>{{cite web|url=http://docs.php.net/manual/ru/features.php |title=PHP: Отличительные особенности — Manual |date=2009-06-21 |lang=ru |access-date=2009-11-13 |archive-url=https://www.webcitation.org/616XjSW8d?url=http://docs.php.net/manual/ru/features.php |archive-date=2011-08-21 }}</ref>. Основные из них: | |||
* Автоматическое извлечение [[HTTP#POST|POST]]- и [[HTTP#GET|GET]]-параметров, а также переменных окружения веб-сервера в предопределённые массивы; | |||
* Взаимодействие с большим количеством различных систем управления базами данных через дополнительные модули ([[MySQL]], [[MySQLi]], [[SQLite]], [[PostgreSQL]], [[Oracle Database]] (OCI8), [[Microsoft SQL Server]], [[Sybase]], [[ODBC]], [[mSQL]], [[IBM DB2]], [[Cloudscape]] и [[Apache Derby]], [[Informix]], [[Ovrimos SQL]], [[Lotus Notes]], [[DB++]], [[DBM]], [[dBase]], [[DBX (СУБД)|DBX]], [[FrontBase]], [[FilePro]], [[Ingres II]], [[SESAM]], [[Firebird]] и [[InterBase]], [[Paradox File Access]], [[MaxDB]], [[интерфейс]] [[PDO]], [[Redis]]); | |||
* Автоматизированная отправка [[Заголовки HTTP|HTTP-заголовков]]; | |||
* Работа с HTTP-авторизацией; | |||
* Работа с [[cookies]] и сессиями; | |||
* Работа с локальными и удалёнными файлами, [[Сокет (программный интерфейс)|сокетами]]; | |||
* Обработка файлов, загружаемых на сервер; | |||
* Работа с [[XForms]]; | |||
* Создание и работа с [[API]]; | |||
* Создание приложений с [[Графический интерфейс пользователя|графическим интерфейсом пользователя]] при использовании фреймворка [[Qt Designer]]; | |||
* Создание консольных приложений. | |||
По состоянию на 2022 год используется сотнями тысяч разработчиков; согласно рейтингу корпорации [[Индекс TIOBE|TIOBE]], базирующемуся на данных поисковых систем, в декабре 2022 года PHP находился на 10 месте по популярности среди языков программирования<ref name="tiobe" />. | |||
Входит в [[LAMP]] — распространённый набор [[Программное обеспечение|ПО]] для создания и [[хостинг]]а [[веб-сайт]]ов ([[Linux]], [[Apache HTTP Server|Apache]], [[MySQL]], PHP), а также LEMP — не менее распространённый набор [[Программное обеспечение|ПО]] ([[Linux]], [[Nginx]], [[MySQL]], PHP). | |||
Среди сайтов, использующих PHP — [[Facebook]], [[Wikipedia]], [[Yahoo!]], [[Baidu]]. | |||
Также, на PHP написаны такие системы управления сайтами ([[Система управления содержимым|CMS]]) и фреймворки ([[CMF]]), как [[Drupal]], [[Joomla]], [[Laravel]], [[Symfony]], [[WordPress]], [[Yii]] и другие. | |||
== Поддержка версий == | |||
{| class="wikitable floatright" | |||
|- | |||
| | |||
|+ Статус поддержки версий и ветвей PHP | |||
|- | |||
! Последняя версия ветви !! Сроки бесплатной и платной поддержки ветви | |||
|- | |||
|style="background:#D4F4B4"|8.5.4<ref>[https://www.php.net/releases/8.5/ru.php PHP: PHP 8.5 Release Announcement]</ref> | |||
|{{start date|2025|11|20|df=yes}} — {{end date|2029|12|31|df=yes}}<ref>[https://wiki.php.net/todo/php85 PHP: todo:php85]</ref> | |||
Завершение {{обратный отсчёт|31|12|2029}} | |||
{{color box|#fff|$|#084f09|border=#084f09}} PHP LTS до конца 2031. | |||
|- | |||
|style="background:#D4F4B4"|8.4.19<ref>{{Cite web |url=https://www.php.net/releases/8.4/ru.php |title=PHP: PHP 8.4 Release Announcement|access-date=2024-11-21 |archive-date=2024-11-21 |archive-url=https://web.archive.org/web/20241121034852/https://www.php.net/releases/8.4/ru.php |url-status=live }}</ref> | |||
|{{start date|2024|11|21|df=yes}} — {{end date|2028|12|31|df=yes}}<ref>{{Cite web |url=https://wiki.php.net/todo/php84 |title=PHP: todo: php84 |access-date=2023-11-24 |archive-date=2023-11-24 |archive-url=https://web.archive.org/web/20231124231029/https://wiki.php.net/todo/php84 |url-status=live }}</ref> | |||
Завершение {{обратный отсчёт|31|12|2028}} | |||
{{color box|#fff|$|#084f09|border=#084f09}} PHP LTS до конца 2030. | |||
|- | |||
|style="background: #FEF8C6"|8.3.30<ref>{{Cite web|url=https://www.php.net/downloads.php#v8.3.30|title=PHP: Downloads|access-date=2026-01-15|url-status=live|archive-date=2023-11-23|archive-url=https://web.archive.org/web/20231123173932/https://www.php.net/downloads.php#v8.3.30}}</ref> | |||
|{{start date|2023|11|23|df=yes}} — {{end date|2027|12|31|df=yes}}<ref>{{Cite web |url=https://www.php.net/releases/8.3/ru.php |title=PHP: PHP 8.3.0 Release Announcement |access-date=2023-11-23 |archive-date=2023-11-23 |archive-url=https://web.archive.org/web/20231123183645/https://www.php.net/releases/8.3/ru.php |url-status=live }}</ref><ref>{{Cite web |url=https://www.zend.com/blog/php-8-3 |title=Changes to Watch in PHP 8.3: Features, Deprecations, and More {{!}} Zend by Perforce> |access-date=2023-11-10 |archive-date=2023-11-10 |archive-url=https://web.archive.org/web/20231110180405/https://www.zend.com/blog/php-8-3 |url-status=live }}</ref><ref>{{Cite web |url=https://www.php.net/archive/2023.php#2023-11-23-2 |title=PHP: News Archive — 2023 |access-date=2023-11-23 |archive-date=2023-10-02 |archive-url=https://web.archive.org/web/20231002023509/https://www.php.net/archive/2023.php#2023-11-23-2 |url-status=live }}</ref>. | |||
Завершение {{обратный отсчёт|31|12|2027}} | |||
{{color box|#fff|$|#084f09|border=#084f09}} PHP LTS до конца 2029. | |||
|- | |||
|style="background: #FEF8C6"|8.2.30<ref>{{Cite web|url=https://www.php.net/downloads.php#v8.2.30|title=PHP: Downloads|archive-url=https://web.archive.org/web/20231123173932/https://www.php.net/downloads.php#v8.2.30|archive-date=2023-11-23|access-date=2025-12-18|url-status=live}}</ref> | |||
|{{start date|2022|12|08|df=yes}} — {{end date|2026|12|31|df=yes}}. | |||
Завершение {{обратный отсчёт|31|12|2026}} | |||
{{color box|#fff|$|#084f09|border=#084f09}} PHP LTS до конца 2028. | |||
|- | |||
|style="background: #FDB3AB"|8.1.34<ref>{{Cite web|url=https://www.php.net/downloads.php#v8.1.34|title=PHP: Downloads|archive-url=https://web.archive.org/web/20231123173932/https://www.php.net/downloads.php#v8.1.34|archive-date=2023-11-23|access-date=2025-12-18|url-status=live}}</ref> | |||
|{{start date|2021|11|25|df=yes}} — {{end date|2025|12|31|df=yes}}. | |||
{{color box|#084f09|$|#fff}} PHP LTS до конца 2027<ref name="php-lts">{{Cite web |url=https://www.zend.com/services/php-long-term-support |title=Источник |archive-date=2023-12-09 |access-date=2023-12-09 |archive-url=https://web.archive.org/web/20231209212024/https://www.zend.com/services/php-long-term-support |url-status=live }}</ref>. | |||
|- | |||
| style="background: #FDB3AB" |7.4.33<ref name="автоссылка1" /> | |||
|{{start date|2019|11|28|df=yes}} — {{end date|2022|11|28|df=yes}}. | |||
{{color box|#084f09|$|#fff}} PHP LTS до конца 2026<ref name="php-lts"></ref>. | |||
|- | |||
| style="background: #FDB3AB" |7.3.33<ref name="автоссылка1" /> | |||
|{{start date|2018|12|06|df=yes}} — {{end date|2021|12|06|df=yes}}. | |||
{{color box|#084f09|$|#fff}} PHP LTS до конца 2026<ref name="php-lts"></ref>. | |||
|- | |||
| style="background: #FDB3AB" |7.2.34<ref name="автоссылка1" /> | |||
|{{start date|2017|11|30|df=yes}} — {{end date|2020|11|30|df=yes}}. | |||
{{color box|#084f09|$|#fff}} PHP LTS до конца 2026<ref name="php-lts"></ref>. | |||
|- | |||
|style="background: #CCC"|8.0.30<ref name="автоссылка1">{{Cite web |url=https://www.php.net/eol.php |title=PHP: Unsupported Branches |access-date=2023-11-07 |archive-date=2023-11-07 |archive-url=https://web.archive.org/web/20231107101828/https://www.php.net/eol.php |url-status=live }}</ref> | |||
|{{start date|2020|11|26|df=yes}} — {{end date|2023|11|26|df=yes}}. | |||
{{color box|#084f09|$|#fff}} PHP LTS до конца 2025<ref name="php-lts"></ref>. | |||
|- | |||
|colspan="2"|'''Статус поддержки:'''<br> {{color box|lightblue}} анонсирована <br> {{color box|#D4F4B4}} активная {{color box|#FEF8C6}} временная {{color box|#FDB3AB}} завершена <br> {{color box|#fff|$|#084f09|border=#084f09}} опционально платная {{color box|#084f09|$|#fff}} только платная <br> {{color box|#ccc}} отсутствует | |||
|- | |||
| | |||
| | |||
|} | |||
Каждая новая минорная [[Ветвь (управление версиями)|ветвь разработки]] PHP (например, 8.5), разрабатывается в течение одного года и, как правило, в период с ноября по декабрь выходит очередной релиз {{color box|#66FF66}} первоначальной стабильной версии, которая бесплатно поддерживается в течение 4 лет. В течение 2 лет осуществляется {{color box|#D4F4B4}} активная поддержка ветви, обнаруженные ошибки и проблемы безопасности исправляются и выпускаются обновления в виде регулярных точечных релизов<ref>{{Cite web |url=https://www.php.net/supported-versions.php |title=PHP: Supported Versions |access-date=2023-11-06 |archive-date=2023-09-26 |archive-url=https://web.archive.org/web/20230926235811/https://www.php.net/supported-versions.php |url-status=live }}</ref>. | |||
После окончания двухлетнего периода активной поддержки каждая ветвь получает {{color box|#FEF8C6}} временную поддержку в течение ещё 2 дополнительных лет только для критических обновлений, касающихся проблем безопасности. Релизы в течение этого периода выходят по мере необходимости: может быть несколько релизов или ни одного, в зависимости от количества отчётов об ошибках<ref>{{Cite web |url=https://bugs.php.net/stats.php |title=PHP :: Bugs Stats |access-date=2023-11-21 |archive-date=2023-11-21 |archive-url=https://web.archive.org/web/20231121221641/https://bugs.php.net/stats.php |url-status=live }}</ref>. | |||
Начиная с версии PHP 8.1, по истечении 4 лет с релиза первоначальной стабильной версии, срок поддержки ветви {{color box|#FDB3AB}} завершается 31 декабря соответствующего года, когда наступает конец жизни ветви — ''End Of Life'', также обозначается ''EOL'' и она больше не поддерживается (для PHP 8.1 срок бесплатной поддержки завершился 31 декабря 2025). В случае, если релиз первоначальной стабильной версии выйдет с задержкой (после нового года), то дополнительный год поддержки не предоставляется: например, релиз ветви PHP 8.5 был запланирован на ноябрь 2025 года, но даже если бы произошла задержка и дата релиза была бы перенесена на 2026 год, то срок бесплатной поддержки ветви все равно продлился только до 31 декабря 2029 года<ref>{{Cite web |url=https://wiki.php.net/rfc/release_cycle_update |title=PHP: rfc:release_cycle_update |access-date=2024-05-20 |archive-date=2024-05-20 |archive-url=https://web.archive.org/web/20240520225626/https://wiki.php.net/rfc/release_cycle_update |url-status=live }}</ref>. Использование устаревших версий PHP из неподдерживаемых ветвей не рекомендовано, потому что это может привести к уязвимостям в безопасности и ошибкам, которые были исправлены в более поздних версиях<ref>{{Cite web |url=https://www.php.net/eol.php |title=PHP: PHP: Unsupported Branches |access-date=2023-11-07 |archive-date=2023-11-07 |archive-url=https://web.archive.org/web/20231107101828/https://www.php.net/eol.php |url-status=live }}</ref>. | |||
[[Zend]] предлагает платную активную долгосрочную поддержку — PHP Long Term Support (PHP LTS): | |||
* {{color box|#fff|$|#084f09}} опционально платную для актуальных ветвей PHP; | |||
* {{color box|#084f09|$|#fff}} только платную для устаревших ветвей PHP. | |||
Срок платной поддержки каждой ветви начиная с релиза первоначальной стабильной версии составляет, как минимум, 5 лет<ref>{{Cite web|url=https://www.zend.com/services/php-long-term-support|title=PHP Support for PHP 7.2 - 8.0 {{!}} PHP LTS {{!}} Zend by Perforce|archive-url=https://web.archive.org/web/20231209212024/https://www.zend.com/services/php-long-term-support|archive-date=2023-12-09|access-date=2024-05-23|url-status=live}}</ref><ref>{{Cite web |url=https://www.zend.com/products/zendphp-enterprise |title=ZendPHP Enterprise {{!}} Zend<!-- Заголовок добавлен ботом --> |access-date=2024-07-05 |archive-date=2024-07-05 |archive-url=https://web.archive.org/web/20240705223532/https://www.zend.com/products/zendphp-enterprise |url-status=live }}</ref>. | |||
=== Распределение версий PHP === | |||
{{Диаграмма круговая | |||
| 340 | круг | справа | внизу | нет | 4 | |||
| Используемые версии PHP на 20.02.2026:<br>3 месяца после релиза PHP 8.5<ref name="автоссылка3">[https://w3techs.com/technologies/details/pl-php/8 Usage Statistics and Market Share of PHP Version 8 for Websites, February 2025]</ref><ref name="автоссылка2">[https://w3techs.com/technologies/details/pl-php/7 Usage Statistics and Market Share of PHP Version 7 for Websites, February 2025]</ref><ref>[https://w3techs.com/technologies/details/pl-php/5 Usage Statistics and Market Share of PHP Version 5 for Websites, February 2025</ref><ref>[https://w3techs.com/technologies/details/pl-php/4 Usage Statistics and Market Share of PHP Version 4 for Websites, February 2025]</ref> | |||
| 0.28 | |||
|PHP 8.5 (0,50 % от PHP 8) — '''0,28 %'''<br> | |||
| #66FF66 | |||
| 4.64 | |||
|PHP 8.4 (8,20 % от PHP 8) — '''4,64 %'''<br> | |||
| #D4F4B4 | |||
| 13.58 | |||
|PHP 8.3 (24,0 % от PHP 8) — '''13,58 %'''<br> | |||
| #FEF8C6 | |||
| 20.60 | |||
|PHP 8.2 (36,4 % от PHP 8) — '''20,60 %'''<br> | |||
| #FFCC66 | |||
|12.11 | |||
|PHP 8.1 (21,4 % от PHP 8) — '''12,11 %'''<br> | |||
| #FF7800 | |||
|5.09 | |||
{{ | |PHP 8.0 (9,00 % от PHP 8) — '''5,09 %'''<br> Совокупная доля '''PHP {{color box|MediumSeaGreen|8.x|#FFF}}''' — '''56,6 %'''<br> | ||
| #FF3300 | |||
|25.31 | |||
|PHP 7.4 (73,8 % от PHP 7) — '''25,31 %'''<br> | |||
| #dc2626 | |||
|3.67 | |||
|PHP 7.3 (10,7 % от PHP 7) — '''3,67 %'''<br> | |||
| #ef4444 | |||
|2.88 | |||
|PHP 7.2 (8,40 % от PHP 7) — '''2,88 %'''<br> | |||
| #f87171 | |||
|1.22 | |||
|PHP 7.1 (3,50 % от PHP 7) — '''1,22 %'''<br> | |||
| #fca5a5 | |||
| 1.27 | |||
|PHP 7.0 (3,70 % от PHP 7) — '''1,27 %'''<br> Совокупная доля '''PHP {{color box|#dc2626|7.x|#fff}}''' — '''34,3 %'''<br> | |||
| #fecaca | |||
| 4.9500 | |||
|PHP 5.6 (55,0 % от PHP 5) — '''4,9500 %'''<br> | |||
| #075985 | |||
|0.7200 | |||
|PHP 5.5 (8,0 % от PHP 5) — '''0,7200 %'''<br> | |||
| | | #0369a1 | ||
| | |||
| | | 1.3500 | ||
| | |PHP 5.4 (15,0 % от PHP 5) — '''1,3500 %'''<br> | ||
| | | #0284c7 | ||
| | |||
| | |1.3410 | ||
| | |PHP 5.3 (14,90 % от PHP 5) — '''1,3410 %'''<br> | ||
| | | #0ea5e9 | ||
| | |||
| | | 0.5940 | ||
| | |PHP 5.2 (6,60 % от PHP 5) — '''0,5940 %'''<br> | ||
| | | #38bdf8 | ||
| 0.0360 | |||
|PHP 5.1 (0,40 % от PHP 5) — '''0,0360 %'''<br> | |||
| #7dd3fc | |||
| 0.0 | |||
|PHP 5.0 (менее 0,1 % от PHP 5) <!-- — '''0%''' --><br> | |||
Совокупная доля '''PHP {{color box|#075985|5.x|#fff}}''' — '''9,0 %'''<br> | |||
|#bae6fd | |||
|0.0738 | |||
|PHP 4.4 (73,8 % от PHP 4) — '''0,0738 %'''<br> | |||
| #525252 | |||
| 0.0222 | |||
|PHP 4.3 (22,2 % от PHP 4) — '''0,0222 %'''<br> {{color box|#a3a3a3}} PHP 4.2 (2,60 % от PHP 4) — '''0,0026 %''' <br> {{color box|#d4d4d4}} PHP 4.1 (0,70 % от PHP 4) — '''0,0007 %'''<br> {{color box|#e5e5e5}} PHP 4.0 (0,70 % от PHP 4) — '''0,0007 %'''<br> Совокупная доля '''PHP {{color box|#525252|4.x|#fff}}''' — '''0,1 %'''<br><br> Актуальные ветви ({{color box|#66FF66}} 8.5, {{color box|#D4F4B4}} 8.4, {{color box|#FEF8C6}} 8.3, {{color box|#FFCC66}} 8.2) — '''36,11 %'''<br>Устаревшие ветви ({{color box|#FF7800}} 8.1, {{color box|#FF3300}} 8.0,{{color box|#dc2626|7.x|#fff}}, {{color box|#075985|5.x|#fff}}, {{color box|#525252|4.x|#fff}}) — '''60,63 %'''<br> PHP LTS ветви ({{color box|#FF7800}} 8.1, {{color box|#dc2626}} 7.4, {{color box|#ef4444}} 7.3, {{color box|#f87171}} 7.2) — '''43,98 %'''<br>Неподдерживаемые ветви ({{color box|#FF3300}} 8.0, {{color box|#fca5a5}} 7.1, {{color box|#fecaca}} 7.0, {{color box|#075985|5.x|#fff}}, {{color box|#525252|4.x|#fff}}) — '''16,65%'''<br>| | |||
#737373 | |||
<!-- Диаграмма поддерживает только 20 секторов, хотя в английской версии - 30 секторов. Можно ли внедрить поддержку большего числа секторов? --> | |||
}} | }} | ||
=== | W3Techs сообщает, что по состоянию на 20 февраля 2026 года (3 месяца после релиза PHP 8.5) «PHP используется на 72''' '''% всех веб-сайтов, чей серверный язык программирования мы знаем».<ref>{{cite web |title=Usage statistics of PHP for websites |url=https://w3techs.com/technologies/details/pl-php |website=W3Techs – World Wide Web Technology Surveys |publisher=W3Techs}}</ref> Также сообщается, что из всех сайтов, использующих PHP: | ||
* '''PHP {{color box|MediumSeaGreen|8.x|#FFF}}''' используют '''56,6 %''' пользователей, из которых актуальные ветви с активной или временной бесплатной поддержкой (8.5, 8.4, 8.3 и 8.2) используют '''39,11 %''' пользователей; | |||
* '''PHP {{color box|#dc2626|7.x|#fff}}''' используют '''34,3 %''' пользователей: | |||
* '''PHP {{color box|#075985|5.x|#fff}}''' используют '''9,0 %''' пользователей, версии, которые не поддерживаются исправлениями безопасности с 2018 года и, как известно, имеют серьёзные уязвимости. | |||
* '''PHP {{color box|#525252|4.x|#fff}}''' используют '''0,1 %''' пользователей, версии, которые также не поддерживаются. | |||
Это означает, что по состоянию на 20 февраля 2026 года подавляющее большинство сайтов — '''60,36 %''', использующих PHP, могут быть уязвимы для взлома; хотя в рамках PHP LTS от Zend ветви {{color box|#FF7800}} 8.1, {{color box|#dc2626}} 7.4, {{color box|#ef4444}} 7.3 и {{color box|#f87171}} 7.2 (в совокупности '''43,97 %''') могут поддерживаться, кроме того некоторые дистрибутивы Linux, такие как [[Ubuntu]] и [[Debian]], также предоставляют коммерческую поддержку и платные исправления безопасности, например, для ветви {{color box|#dc2626}} 7.4<ref>{{Cite web|url=https://wiki.debian.org/LTS/Extended|title=LTS/Extended – Debian Wiki|website=wiki.debian.org|archive-url=https://web.archive.org/web/20200715090538/https://wiki.debian.org/LTS/Extended|archive-date=2020-07-15|access-date=2023-09-11|url-status=live}}</ref><ref>{{cite web|url=https://security-tracker.debian.org/tracker/source-package/php7.4|title=Information on source package php7.4|website=Security Bug Tracker|publisher=Debian|archive-url=https://web.archive.org/web/20230611092033/https://security-tracker.debian.org/tracker/source-package/php7.4|archive-date=2023-06-11|access-date=2023-06-11|url-status=live}}</ref>. | |||
Устаревшие и неподдерживаемые ветви PHP, включая {{color box|#FF3300}} 8.0, {{color box|#fca5a5}} 7.1, {{color box|#fecaca}} 7.0, {{color box|#075985|5.x|#fff}} и {{color box|#525252|4.x|#fff}} (в совокупности '''16,65 %''') настоятельно не рекомендуются к использованию. | |||
== Дополнительные возможности == | |||
Язык автоматически поддерживает [[HTTP-Cookies|HTTP Cookies]] в соответствии со стандартами Netscape. Это позволяет проводить установку и чтение небольших сегментов данных на стороне клиента. Работа с Cookies организована посредством сеансов (сессий). У сессий есть срок действия (после его истечения данные удаляются), в сессиях можно хранить и редактировать разные типы данных, в том числе сериализованные — пропущенные через serialize (процесс происходит автоматически), PHP-объекты. | |||
=== {{Видимый якорь}}Создание GUI-приложений === | |||
PHP не ориентирован на создание десктопных приложений, но есть потребность в создании интерфейсов для настройки серверов, беспрерывного выполнения, отладки скриптов (сценариев), управления локальными и тестовыми серверами, и т. п. Из-за этого и возникли решения данной проблемы. | |||
==== Расширения ==== | |||
Основное использование расширений — надстройки библиотек [[Интерфейс пользователя|интерфейсов пользователя]] (UI-библиотек). | |||
Расширения условно делятся на три группы: | |||
* расширения PHP: WxPHP ([[Microsoft Windows|Windows]], [[Linux]], [[macOS]]), Winbinder ([[Microsoft Windows|Windows]]); | |||
* обёртки, использующие системные функции средствами [[Интерфейс внешних функций|интерфейса внешних функций]]: Win32Std, Tk; | |||
* обёртки для использования интерфейса командной строки: PHP-UI, PHP-XCB. | |||
Разработаны расширения, такие, как двусторонняя обёртка для использования других языков при написании расширений PHP, и наоборот. Например, PSV Component Library, — проект, состоящий из трёх подпроектов: | |||
* PHP4Delphi реализует соединения PHP с программами, написанными на [[Delphi (среда разработки)|Delphi]] средствами [[Windows API|WinAPI]]; разрабатывался с 1999 года, но не обновлялся с 2009 года, из-за чего появились ответвления; | |||
* PHP extensions development framework — средство создания расширений PHP, VCL-компоненты — неотъемлемая часть PHP4Delphi, базовые компоненты которой нужны для создания приложений; | |||
* php4 Applications — расширение для использования PHP в других языках, базирующееся на PHP4Delphi, дающее доступ к [[Макросы|макросам]] и упрощающее использование PHP, избавляя от создания обёртки. | |||
==== Среды разработки (IDE) ==== | |||
Есть место и полноценным средам разработки для GUI PHP: | |||
* '''Dev PHP''' | |||
Первопроходцем в этой категории является студия Dev PHP-IDE, которая использовала [[Kylix]] ([[Embarcadero Delphi|Delphi]]) в качестве основы интерфейса и php-[[Command-line interface|cli]] для создания пользовательских программ. | |||
Она включала в себя редактор кода, несколько инструментов и визуальный просмотр HTML-страниц. | |||
Впервые была представлена в 2002 году, сейчас имеет 3 стабильные версии, но разработка не продолжается — остановилась из-за гибели главного разработчика в автокатастрофе. | |||
* '''CodeGear Rad Studio (Расширение)''' | |||
После DevPHP IDE появилось расширение — набор компонентов для [[CodeGear Delphi|CodeGear Rad Studio 2009]] на базе php4delphi с некоторыми улучшениями (веб-элементы, инспектор, отладчик), поддержка её длилась в течение четырёх версий, вторая из которых вошла в платное расширение [[CodeGear Delphi|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 AntiVirus|AVG]], [[Avira Antivirus|Avira]]) стали распознавать любые скомпилированные в DevelStudio программы как вирусы. | |||
Через некоторое время автор AlphaControls обратился с жалобой к разработчикам DevelStudio, и набор компонентов был полностью удалён из среды, однако сохранился в уже существовавшей версии, удалить которую с форума в этот раз не представлялось возможным. | |||
На момент 2012 года вышла последняя версия среды — 3.0.2, где появился новый набор компонентов, в том числе браузер [[Chromium]] вместо [[Internet Explorer|IE]], что привлекло внимание веб-разработчиков и пользователей среды «Алгоритм». На тот момент компиляция программ в «Алгоритме» была платной, поэтому DevelStudio как новая и бесплатная среда разработки переманила на себя бо́льшую часть аудитории. | |||
В 2014 году начались первые попытки по восстановлению среды, в этот раз со стороны [[Сообщество|сообщества]]. В конце 2018 года исходный код был восстановлен и доступен в [[GitHub]]. | |||
В 2019 году сообщество обратилось к создателю DevelStudio с целью изменения политики распространения среды, вследствие чего она стала доступной для обновления и редактирования. Из-за жалоб на отсутствие ссылок на использованные библиотеки (DCEF, PHP4Delphi, TSizeCtrl, SynEdit) форум был удалён, а одна из страниц с описанием среды была перенаправлена на главную страницу сайта. С этого момента DevelStudio официально принадлежит сообществу. | |||
* '''DevelNext (DN)''' | |||
Параллельно с этим главный разработчик DevelStudio начал создавать «реинкарнацию» предыдущей среды. Он взял за основу графическую библиотеку [[JavaFX]], в результате вышла полностью новая среда, с поддержкой [[CSS]], '''но без полной поддержки библиотеки [[Zend Framework|Zend PHP]]''' — проект был основан на собственном языке jPHP. Его особенностью является, работа на [[JVM]], [[JIT]]-компилятор, поддержка [[юникод]]а, [[многопоточность]] и объектно-ориентированная стандартная библиотека. | |||
В 16-й версии среда DevelNext получила поддержку php 7, а параллельно с этим jPHP был расширен энтузиастом для разработки под ОС [[Android]]. | |||
На данный момент автор и энтузиасты трудятся над 2020 версией (ранее 17-я). | |||
* '''PHPQt''' | |||
В 2015 году Александр Казанцев начал изучать алгоритмы разработки интерфейсов и создал расширение php_qml, что давало возможность использовать виджеты из библиотеки [[Qt|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 к проекту ==== | |||
Также существуют расширения и для противоположного применения — подключения 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) | |||
== История<ref>{{Cite web|url=https://www.php.net/manual/ru/history.php.php|title=PHP: История PHP - Manual|website=www.php.net|access-date=2024-03-30|archive-date=2024-03-30|archive-url=https://web.archive.org/web/20240330183304/https://www.php.net/manual/ru/history.php.php|url-status=live}}</ref> == | |||
{{main|История PHP}} | |||
{{несколько изображений | |||
| изобр1=Rasmus Lerdorf cropped.jpg | |||
| изобр2=Andi Gutmans 1.jpg | |||
| изобр3=Zeev Suraski 2005 cropped.jpg | |||
| подпись=[[Лердорф, Расмус|Расмус Лердорф]], создатель PHP; [[Гутманс, Энди|Энди Гутманс]] и [[Сураски, Зеев|Зеев Сураски]], основатели [[Zend Engine]] | |||
| ширина=105 | |||
| выравнивание=справа | |||
}} | |||
=== PHP Tools, FI, Construction Kit === | |||
Разработка PHP началась в [[1993 год]]у<ref>{{Cite web |url=https://www.infoworld.com/article/2609877/believe-the-hype--php-founder-backs-facebook-s-hiphop-technology.html |title=Believe the hype: PHP founder backs Facebook’s HipHop technology|website=[[InfoWorld]]|access-date=2023-11-28 |archive-date=2023-09-23 |archive-url=https://web.archive.org/web/20230923211613/https://www.infoworld.com/article/2609877/believe-the-hype--php-founder-backs-facebook-s-hiphop-technology.html |url-status=live }}</ref> когда [[Дания|датский]] [[программист]] [[Лердорф, Расмус|Расмус Лердорф]] разработал на [[Си (язык программирования)|C]]<ref>{{Cite web|url=https://twitter.com/rasmus/status/226405807305138176|title=I wonder why people keep writing that PHP was ever written in Perl. It never was. #php|author=Rasmus Lerdorf|date=2012-07-20|publisher=@rasmus|lang=en|access-date=2019-01-08|archive-date=2018-01-03|archive-url=https://web.archive.org/web/20180103031619/https://twitter.com/rasmus/status/226405807305138176|url-status=live}}</ref> набор [[Common Gateway Interface|CGI]]-скриптов для учёта посетителей его [[онлайн]]-[[резюме]], обрабатывающий шаблоны [[HTML]]-документов. Лердорф назвал набор ''Personal Home Page Tools'' (Инструменты для ''личной домашней страницы''). Вскоре функциональности перестало хватать, и Лердорф разработал новый интерпретатор шаблонов ''PHP/FI'' ({{lang-en|Personal Home Page / Forms Interpreter}} — «персональная домашняя страница / интерпретатор форм»)<ref>{{книга|автор=Савельева Н.|заглавие=Основы программирования на РНР : курс лекций : учеб. пособие : для студентов вузов, обучающихся по специальностям в обл. информ. технологий|язык=ru|ссылка=https://intuit.ru/studies/courses/42/42/lecture/27175|место=М.|всего страниц=260|isbn=5-9556-0026-4|archive-date=2025-11-17|access-date=2026-02-04|archive-url=https://web.archive.org/web/20251117223101/https://intuit.ru/studies/courses/42/42/lecture/27175|url-status=live}}</ref>. | |||
8 июня 1995 года вышел Personal Home Page (PHP Tools) version 1.0 — первый публичный релиз с открытым исходным кодом. Эта новая реализация была способна взаимодействовать с базами данных и многое другое, что создавало фреймворк, с помощью которого пользователи могли создавать простые динамические веб-приложения. | |||
=== PHP 2 === | |||
В [[1997 год]]у после длительного [[бета-тестирование|бета-тестирования]] вышла вторая версия обработчика, написанного на [[Си (язык программирования)|C]] — PHP/FI 2.0. Её использовали всего 1 % (приблизительно 50 тысяч) всех [[Доменное имя|интернет-доменов]] мира<ref name="off_history"/>, так как к моменту выпуска языка в релиз, парсер языка был полностью переписан двумя программистами из [[Тель-Авив|Тель-Авива]]: [[Гутманс, Энди|Энди Гутмансом]] и [[Сураски, Зеев|Зивом Сураски]]. | |||
=== PHP 3 и Zend Engine === | |||
Версия '''PHP 3.0''' подверглась значительной переработке, определившей современный облик и стиль языка программирования. В 1997 году два израильских программиста, [[Гутманс, Энди|Энди Гутманс]] и [[Сураски, Зеев|Зеев Сураски]], полностью переписали код интерпретатора. PHP 3.0 был официально выпущен в июне [[1998 год]]а<ref name="off_history"/>. | |||
Одной из сильнейших сторон PHP 3.0 была возможность расширения ядра дополнительными модулями. Впоследствии интерфейс написания расширений привлёк к PHP множество сторонних разработчиков, работающих над своими модулями, что дало PHP возможность работать с огромным количеством [[база данных|баз данных]], [[сетевой протокол|протоколов]], поддерживать большое число [[интерфейс программирования приложений|API]]. Большое количество разработчиков привело к быстрому развитию языка и стремительному росту его популярности. С этой версии [[акроним]] ''php'' расшифровывается как «PHP: hypertext Preprocessor», вместо устаревшего «Personal Home Page». | |||
К зиме 1998 года, практически сразу после официального выхода PHP 3.0, Энди Гутманс и Зеев Сураски начали переработку ядра PHP. В задачи входило увеличение производительности сложных приложений и улучшение модульности базиса кода PHP. Новый движок, названный [[Zend Engine]], успешно справлялся с поставленными задачами и впервые был представлен в середине [[1999 год]]а. | |||
=== PHP 4 === | |||
'''PHP 4.0''', основанный на движке [[Zend Engine]] и принёсший с собой набор дополнительных функций, официально вышел в мае [[2000 год]]а. В дополнение к улучшению производительности, PHP 4.0 имел ещё несколько ключевых нововведений, таких как поддержка сессий, [[Буферизация (информатика)|буферизация]] вывода, более безопасные способы обработки вводимой пользователем информации и несколько новых языковых конструкций. | |||
=== PHP 5 === | |||
'''PHP 5''' вышел [[13 июля]] [[2004 год]]а. Изменения включают обновление ядра Zend (''Zend Engine 2''), что существенно увеличило эффективность [[интерпретатор]]а. Введена поддержка языка разметки [[XML]]. Полностью переработаны функции [[Объектно-ориентированное программирование|ООП]], которые стали во многом схожи с моделью, используемой в [[Java]]. В частности, введён [[деструктор]], [[Инкапсуляция (программирование)|открытые, закрытые и защищённые члены и методы]], окончательные члены и методы, [[Интерфейс (объектно-ориентированное программирование)|интерфейсы]] и клонирование объектов. | |||
В последующих версиях также были введены [[Пространство имён (программирование)|пространства имён]], [[замыкание (программирование)|замыкания]] и целый ряд достаточно серьёзных изменений, количественно и качественно сравнимых с теми, которые появились при переходе на PHP 5.0. | |||
=== PHP 6 === | |||
Разработка '''PHP 6''' велась с [[Октябрь 2006 года|октября 2006]] года<ref>{{Cite web |url=http://www.php.net/~scoates/unicode/render_func_data.php |title=Количество переписанных функций с поддержкой Юникода |access-date=2007-01-19 |archive-date=2007-01-19 |archive-url=https://web.archive.org/web/20070119233327/http://www.php.net/%7Escoates/unicode/render_func_data.php |url-status=live }}</ref>. Было сделано множество нововведений<ref>{{Cite web |url=http://cvs.php.net/viewvc.cgi/php-src/README.UPDATING_TO_PHP6?view=markup |title=Файл news.txt из дистрибутива PHP 6 |access-date=2007-01-19 |archive-date=2008-12-12 |archive-url=https://web.archive.org/web/20081212121756/http://cvs.php.net/viewvc.cgi/php-src/README.UPDATING_TO_PHP6?view=markup |url-status=dead }}</ref><ref>{{Cite web |url=http://wiki.php.net/todo/php60 |title=Текущий список выполненных и невыполненных работ по PHP 6 |access-date=2008-04-07 |archive-date=2008-04-18 |archive-url=https://web.archive.org/web/20080418050927/http://wiki.php.net/todo/php60 |url-status=live }}</ref>, как, например, исключение из ядра регулярных выражений [[POSIX]] и «длинных» суперглобальных массивов, удаление директив ''safe_mode'', ''magic_quotes_gpc'' и ''register_globals'' из конфигурационного файла php.ini. Одним из основных новшеств должна была стать поддержка [[Юникод]]а<ref name='newphp6'>{{Cite web |url=http://www.php.net/~derick/meeting-notes.html |title=Полный список изменений, которые были запланированы в декабре 2005 года |access-date=2006-08-12 |archive-date=2006-08-12 |archive-url=https://web.archive.org/web/20060812032318/http://www.php.net/~derick/meeting-notes.html |url-status=live }}</ref>. Однако в [[Март 2010 года|марте 2010]] года разработка PHP 6 была признана бесперспективной<ref>[http://www.amiro.ru/blog/tech/how-was-php6-died Как умер PHP6] {{Wayback|url=http://www.amiro.ru/blog/tech/how-was-php6-died |date=20111013161435 }} // amiro.ru</ref> из-за сложностей с поддержкой Юникода. Исходный код PHP 6 перемещён на [[Ветвь (управление версиями)|ветвь]], а основной линией разработки стала версия 5.4. | |||
=== {{Anchor|NG|ZE3}}PHP 7 === | |||
В 2014 году было проведено голосование, по результатам которого следующая версия получила название PHP 7<ref>{{Cite web |url=https://wiki.php.net/rfc/php6 |title=PHP RFC: Name of Next Release of PHP |access-date=2015-03-28 |archive-date=2017-07-03 |archive-url=https://web.archive.org/web/20170703120559/https://wiki.php.net/rfc/php6 |url-status=live }}</ref>. Выход новой версии планировался в середине октября 2015 года<ref>{{Cite web |url=https://wiki.php.net/rfc/php7timeline |title=PHP RFC: PHP 7.0 timeline |access-date=2015-03-28 |archive-date=2015-03-17 |archive-url=https://web.archive.org/web/20150317221945/https://wiki.php.net/rfc/php7timeline |url-status=live }}</ref>. В марте 2015 года [[Zend Technologies|Zend]] представили [[Инфографика|инфографику]], в которой описаны основные нововведения PHP 7<ref>{{Cite web|url=http://www.zend.com/en/resources/php7-5-things-to-know-infographic|title=PHP 7 Coolest Features: Space Ships, Type Hints, 2X Speed|publisher=www.zend.com|lang=en|access-date=2017-07-06|archive-date=2017-07-08|archive-url=https://web.archive.org/web/20170708033906/http://www.zend.com/en/resources/php7-5-things-to-know-infographic|url-status=live}}</ref>. | |||
[[3 декабря]] [[2015 год]]а было объявлено о выходе PHP версии 7.0.0<ref>{{Cite web |url=http://php.net/archive/2015.php#id2015-12-03-1 |title=PHP: News Archive — 2015 |access-date=2015-12-12 |archive-date=2015-12-12 |archive-url=https://web.archive.org/web/20151212001202/http://php.net/archive/2015.php#id2015-12-03-1 |url-status=live }}</ref>. | |||
Новая версия основывается на экспериментальной [[Ветвь (управление версиями)|ветви]] PHP, которая изначально называлась ''phpng'' ({{lang-en|PHP Next Generation}} «следующее поколение»), и разрабатывалась с упором на увеличение производительности и уменьшение потребления памяти<ref>{{cite web |url=https://wiki.php.net/rfc/phpng |title=PHP: rfc:phpng |access-date=2014-12-16 |website=php.net |archive-date=2014-10-19 |archive-url=https://web.archive.org/web/20141019192051/https://wiki.php.net/rfc/phpng |url-status=live }}</ref>. В новой версии добавлена возможность указывать тип возвращаемых из функции данных<ref>{{cite web|url=https://wiki.php.net/rfc/return_types|title=RFC: Return Types|website=php.net|access-date=2015-03-28|archive-date=2017-07-17|archive-url=https://web.archive.org/web/20170717032542/https://wiki.php.net/rfc/return_types|url-status=live}}</ref>, добавлен контроль передаваемых типов для данных<ref>{{cite web|url=https://wiki.php.net/rfc/scalar_type_hints_v5|title=RFC: Scalar Type Declarations|website=php.net|access-date=2015-03-28|archive-date=2017-07-07|archive-url=https://web.archive.org/web/20170707052759/https://wiki.php.net/rfc/scalar_type_hints_v5|url-status=live}}</ref>, а также новые операторы. | |||
13 июня 2019 вышла версия PHP 7.4. В ядро были добавлены типизированные свойства и стрелочные функции, а также ограниченная ковариантность возвращаемого типа и контравариантность типа аргумента<ref>{{Cite web |url=https://www.php.net/manual/ru/migration74.new-features.php#migration74.new-features.core.typed-properties |title=PHP: Новые возможности — Manual |access-date=2020-05-02 |archive-date=2020-05-02 |archive-url=https://web.archive.org/web/20200502120158/https://www.php.net/manual/ru/migration74.new-features.php#migration74.new-features.core.typed-properties |url-status=live }}</ref>. | |||
=== PHP 8 === | |||
PHP версии 8.0 была выпущена 26 ноября 2020-го<ref>{{Cite web |url=https://www.php.net/archive/2020.php#2020-11-26-3 |title=PHP: News Archive — 2020 |access-date=2020-11-29 |archive-date=2020-10-13 |archive-url=https://web.archive.org/web/20201013021707/https://www.php.net/archive/2020.php#2020-11-26-3 |url-status=live }}</ref>. Главными нововведениями стали<ref>{{Cite web |url=https://stitcher.io/blog/new-in-php-8 |title=What’s new in PHP 8 — stitcher.io |access-date=2020-05-03 |archive-date=2020-05-19 |archive-url=https://web.archive.org/web/20200519211012/https://stitcher.io/blog/new-in-php-8 |url-status=live }}</ref>: поддержка [[Объединение (структура данных)|union-типов]]<ref>{{Cite web |url=https://wiki.php.net/rfc/union_types_v2 |title=PHP: rfc: union_types_v2 |access-date=2020-05-03 |archive-date=2020-04-01 |archive-url=https://web.archive.org/web/20200401220134/https://wiki.php.net/rfc/union_types_v2 |url-status=live }}</ref>, [[JIT-компиляция]]<ref>{{Cite web |url=https://wiki.php.net/rfc/jit |title=PHP: rfc: jit |access-date=2020-05-03 |archive-date=2020-05-18 |archive-url=https://web.archive.org/web/20200518110512/https://wiki.php.net/rfc/jit |url-status=live }}</ref> и [[атрибут]]ы (также известны как аннотации), как альтернатива конструкции switch было добавлено выражение match, также был добавлен новый оператор Nullsafe. | |||
9 июля 2020 года Дэйл Хирт ({{lang-en|Dale Hirt}}), менеджер проекта PHP в Microsoft, в рассылке <code>php.internals</code> выпустил сообщение<ref>[https://news-web.php.net/php.internals/110907 Dale Hirt — Microsoft Support of PHP on Windows] {{Wayback|url=https://news-web.php.net/php.internals/110907 |date=20200716152804 }}{{ref|en}}</ref> о том, что после выпуска версии PHP 8.0 Microsoft прекратит поддержку разработки этого языка программирования для [[Windows]]<ref>[https://news.softodrom.ru/ap/b33385.shtml Windows 10 прекратит поддержку PHP] {{Wayback|url=https://news.softodrom.ru/ap/b33385.shtml |date=20200716180736 }}{{ref|ru}}</ref>. Специалисты Microsoft занимались компиляцией бинарных версий интерпретатора для ОС Windows и тестированием их безопасности. В сообществе разработчиков PHP сообщили, что примут все необходимые меры, чтобы найти в ближайшее время альтернативный вариант для организации поддержки PHP 8.0 и выше для Windows, например, своими силами<ref>{{Cite web |url=https://habr.com/ru/news/t/510522/ |title=Специалисты Microsoft не будут заниматься поддержкой PHP 8.0 для Windows |access-date=2020-07-16 |archive-date=2020-07-17 |archive-url=https://web.archive.org/web/20200717005415/https://habr.com/ru/news/t/510522/ |url-status=live }}</ref>. | |||
В ноябре 2025 года выйдет версия 8.5. | |||
== Синтаксис == <!-- TODO ref: англ статья + мануал --> | |||
[[Файл:PHPCode HelloWorld.svg|thumb]] | |||
{{викиучебник}} | |||
Синтаксис PHP [[C-подобный синтаксис|подобен]] синтаксису языка [[Си (язык программирования)|Си]]. Некоторые элементы, такие как [[ассоциативный массив|ассоциативные массивы]] и цикл <code>foreach</code>, заимствованы из [[Perl]]. | |||
[[Лексический анализ]] PHP осуществляется посредством утилиты [[re2c]]<ref>{{cite web | |||
|url = http://www.phpinternalsbook.com/build_system/building_php.html#obtaining-the-source-code | |||
|title = Building PHP | |||
|lang = en | |||
|publisher = PHP Internals Book | |||
|access-date = 2022-03-01 | |||
|archive-date = 2021-05-08 | |||
|archive-url = https://web.archive.org/web/20210508184417/https://www.phpinternalsbook.com/build_system/building_php.html#obtaining-the-source-code | |||
|url-status = live | |||
}}</ref><ref>{{cite web | |||
|url = https://re2c.org/2020_trofimovich_re2c_a_lexer_generator_based_on_lookahead_tdfa.pdf | |||
|title = RE2C: A lexer generator based on lookahead-TDFA | |||
|lang = en | |||
|publisher = Software Impacts | |||
|access-date = 2022-03-01 | |||
|archive-date = 2022-01-27 | |||
|archive-url = https://web.archive.org/web/20220127181256/https://re2c.org/2020_trofimovich_re2c_a_lexer_generator_based_on_lookahead_tdfa.pdf | |||
|url-status = live | |||
}}</ref>, | |||
утилита генерирует быстрые и легко встраиваемые лексеры. | |||
Для написания простейшего скрипта не требуется описывать какие-либо переменные, используемые модули и т. п. Любой скрипт может начинаться непосредственно с оператора <code><?php</code>, а заканчиваться оператором <code>?></code>. Закрывающий оператор не обязателен и его рекомендуется опускать, чтобы избежать проблем с отправкой лишних символов в поток вывода после выполнения основного кода. | |||
Простейшая [[программа Hello world]] на PHP выглядит следующим образом: | |||
<source lang="php" line="1"> | |||
<?php | |||
echo 'Hello, world!'; | |||
</source> | |||
Также возможен более короткий вариант вывода строки: | |||
<source lang="php" line="1"> | |||
<?='Hello, world!'?> | |||
</source> | |||
Открывающий тег вида <code><?=</code> используется для сокращённой записи конструкций, используемых для вывода строки. | |||
Стоит обратить внимание, что хоть <code><?=</code> и является сокращённой формой <code><?php echo</code>, однако не является «сокращённым тегом» (таким как <code><?</code>). Сокращённые теги были помечены устаревшими и их использование крайне не рекомендуется, в отличие от <code><?=</code>, использование которого не будет вызывать проблем с совместимостью и переносимостью кода. | |||
PHP исполняет код, находящийся внутри ограничителей, таких как <code><?php ?></code>. Всё, что находится вне ограничителей, выводится без изменений. В основном это используется для вставки PHP-кода в HTML-документ, например, так: | |||
<source lang="html5" line="1"> | |||
<html> | |||
<head> | |||
<title> | |||
Тестируем PHP | |||
</title> | |||
</head> | |||
<body> | |||
<?php echo 'Привет, мир!'; ?> | |||
</body> | |||
</html> | |||
</source> | |||
До версии 7.0 допускалось использование ограничителей [[Active Server Pages|языка программирования ASP]] <code><% %></code> и <code><script language="php"> </script></code>. Работа сокращённых конструкций определяется в конфигурационном файле php[[.ini]]. | |||
Имена переменных начинаются с символа <code>$</code>, тип переменной объявлять не нужно. Имена переменных и констант чувствительны к регистру символов. Имена классов, методов классов и функций к регистру символов не чувствительны. Переменные обрабатываются в [[Строковый тип|строках]], заключённых в двойные кавычки, и [[heredoc]]-строках (строках, созданных при помощи оператора <<<). Переменные в строках, заключённых в одинарные кавычки и [[Heredoc-синтаксис|nowdoc]] не обрабатываются. | |||
Инструкции разделяются с помощью ''точки с запятой'' (<code>;</code>), за исключением некоторых случаев, после объявления конструкции if/else и циклов. | |||
Переменные в функцию можно передавать как по значению, так и по ссылке (используется знак <code>&</code>). | |||
PHP поддерживает три типа комментариев: в стиле языка [[Си (язык программирования)|Си]] (ограниченные <code>/* */</code>), [[C++]] (начинающиеся с <code>//</code> и идущие до конца строки) и [[Командная оболочка UNIX|оболочки UNIX]] (с <code>#</code> до конца строки). | |||
=== Типы данных === | |||
PHP является языком программирования с [[Динамическая типизация|динамической типизацией]], не требующим указания типа при объявлении переменных, равно как и самого объявления переменных. | |||
К скалярным типам данных относятся: | |||
* [[целый тип|целочисленный тип]] (int) | |||
* [[Числа с плавающей запятой|число с плавающей точкой]] (float) | |||
* [[логический тип]] (bool) | |||
* [[строковый тип]] (string) | |||
К нескалярным типам относятся: | |||
* [[индексный массив|массив]] (array) | |||
* [[объект (программирование)|объект]] (object) | |||
* внешний ресурс (resource) | |||
* неопределённое значение (null) | |||
Диапазон целых чисел (int) в PHP зависит от платформы (для 32-битной архитектуры диапазон числа не превышает 32 бита, то есть, от −2 147 483 648 до 2 147 483 647). Числа можно задавать в десятичной, [[Двоичная система счисления|двоичной]], [[Восьмеричная система счисления|восьмеричной]] и [[Шестнадцатеричная система счисления|шестнадцатеричной]] системах счисления. Диапазон вещественных чисел (float) также зависит от платформы (для 32-битной архитектуры диапазон позволяет оперировать числами от ±1.7×10<sup>−308</sup> до ±1.7×10<sup>+308</sup>). | |||
PHP предоставляет разработчикам [[логический тип]] (bool), способный принимать только два значения <code>true</code> («истина») и <code>false</code> («ложь»). При преобразовании в логический тип число 0, пустая строка, ноль в строке «0», <code>null</code> и пустой массив считаются равными <code>false</code>. Все остальные значения автоматически преобразуются в <code>true</code>. | |||
Специальный тип null предназначен для переменных без определённого значения. Единственным значением данного типа является литерал <code>null</code>. Тип null принимают неинициализированные переменные, переменные инициализированные константой <code>null</code>, а также переменные, удалённые при помощи конструкции <code>unset()</code>. | |||
Ссылки на внешние ресурсы имеют тип «ресурс» (resource). Переменные данного типа, как правило, представляют собой [[Дескриптор (языки разметки)|дескриптор]], позволяющий управлять внешними объектами, такими как файлы, динамические изображения, результирующие таблицы базы данных и т. п. По мере развития языка стандартная библиотека постепенно дорабатывается и ресурсы заменяются объектами. Таким образом планируется полностью избавиться от этого типа. | |||
[[Индексный массив|Массивы]] (array) поддерживают числовые и строковые ключи и являются [[Индексный массив#Специфические типы массивов|гетерогенными]]. Массивы могут содержать значения любых типов, включая другие массивы. Порядок элементов и их ключей сохраняется. Не совсем корректно называть php-массивы массивами, на самом деле это, скорее всего, упорядоченный [[Ассоциативный массив#PHP|хеш]]. Возможно неожиданное поведение при использовании цикла <code>for</code> со счётчиком вместо <code>foreach</code>. Так, например, при сортировке массива с численными индексами функциями из стандартной библиотеки, сортируются и ключи тоже. | |||
==== Типизация ==== | |||
Язык допускает типизацию аргументов, возвращаемых значений [[Функция (программирование)|функций]] и [[Метод (программирование)|методов классов]], а также, начиная с версии 7.4 типизацию [[Поле класса|полей классов]]. Включение [https://www.php.net/manual/en/language.types.declarations.php#language.types.declarations.strict строгого режима] отключает неявные преобразования типов в данных участках кода, что приближает поведение языка к языкам со [[Сильная и слабая типизация|строгой типизацией]]. | |||
Типы <code>int</code>, <code>string</code>, <code>float</code>, <code>bool</code>, <code>array</code>, <code>object</code> и некоторые другие являются допустимыми определениями типа аргумента, поля класса или возвращаемого значения. Также допускается использовать имена классов, либо интерфейсов для определения конкретной реализации. Использование<code>resource</code> для определения типа не допускается. | |||
Современный PHP реализует базовую поддержку [[Алгебраический тип данных|алгебраических типов данных]] и позволяет использовать как [[Конъюнкция|конъюнкцию]], так и [[Дизъюнкция|дизъюнкцию]] при определении типа. Язык не позволяет использовать [[Псевдоним типа|псевдонимы типов]], однако предоставляет несколько встроенных реализаций, которые в рамках PHP именуются «псевдотипами». Подобный термин в языке применяется к любому определению типа, который не является самостоятельным, применимым к значению, а реализован лишь как инструкция проверки типа в Zend VM (иногда применяется устоявшийся англицизм «тайп-хинт»). | |||
<source lang="php" line="1"> | |||
// Для функции определён «псевдотип» mixed | |||
function example(): mixed | |||
{ | |||
return 42; | |||
} | |||
$result = example(); | |||
var_dump($result); | |||
// int(42) | |||
// Однако фактический тип у переменной $result — это int | |||
</source> | |||
К «псевдотипам» относятся: | |||
* [[mixed]] любой тип | |||
* [[iterable]] (array или любой объект, реализующий интерфейс [[итератор]]а). | |||
* [[callback (программирование)|callable]] (функция, [[замыкание (программирование)|анонимная функция]], статичный метод класса или любой другой объект, который имплементирует __invoke())<ref name=":0">{{Cite web|url=https://secure.php.net/manual/ru/language.types.callable.php|title=PHP: Функции обратного вызова (callback-функции) - Manual|publisher=secure.php.net|access-date=2019-02-27|archive-date=2019-02-28|archive-url=https://web.archive.org/web/20190228004028/https://secure.php.net/manual/ru/language.types.callable.php|url-status=live}}</ref> | |||
* [[void]] [https://www.php.net/manual/ru/language.types.declarations.php#language.types.declarations.return-only возвращаемый] тип, означающий отсутствие возврата из функции | |||
* [[never]] возвращаемый тип, означающий прерывание работы приложения | |||
* self тип, требующий соответствие классу в рамках которого данный тип был определён. | |||
* parent тип, требующий соответствие родительскому классу. | |||
* static возвращаемый тип, требующий соответствие классу любого потомка. | |||
* [[Логический тип|false]] и [[Логический тип|true]] типы (часть bool). | |||
Помимо проверок на соответствие типам встроенные «псевдотипы» могут реализовывать дополнительную логику проверок. Например, <code>callable</code> должен соответствовать (одному из): | |||
* анонимной функции; | |||
* строкой, которая должна содержать имя функции; | |||
* массивом где нулевой и первый элемент — строки (интерпретируется как название статической функции класса); | |||
* массивом где нулевой элемент — объект, а первый — строка (интерпретируется как метод у объекта). | |||
=== Функции === | |||
PHP поддерживает как объявление именованных функций, так и анонимных [[Функции первого класса|функций первого класса]], например:<source lang="php" line="1"> | |||
// Объявление именованной функции | |||
function get_hello_world(): string | |||
{ | |||
return 'Hello World!'; | |||
} | |||
// Объявление анонимной функции | |||
$getHelloWorld = function(): string | |||
{ | |||
return 'Hello World!'; | |||
}; | |||
// Короткий синтаксис | |||
$getHelloWorld = fn(): string => 'Hello World!'; | |||
</source>Стоит обратить внимание, что в случае анонимных функций различие состоит не только в визуальных отличиях, но и в способе захвата переменных внешнего контекста. Любая «короткая» форма записи является [[Замыкание (программирование)|замыканием]], в то же время длинная запись для реализации замыкания требует явного указания переменных внутри оператора <code>use</code> из внешнего контекста для их захвата:<source lang="php" line="1"> | |||
$variable = 'Hello World!'; | |||
// Использование оператора use | |||
function() use ($variable): string | |||
{ | |||
return $variable; | |||
}; | |||
// Альтернативный вариант, используя короткий синтаксис | |||
fn(): string => $variable; | |||
</source> | |||
=== Обращение к переменным и функциям === | |||
Обращение к переменным осуществляется с помощью символа <code>$</code>, за которым следует имя переменной. Данная конструкция может быть применена также для создания динамических переменных и функций.<ref>{{Cite web |url=http://php.net/variables.variable |title=PHP: Variable variables — Manual |access-date=2008-12-17 |archive-date=2008-05-11 |archive-url=https://web.archive.org/web/20080511203716/http://php.net/variables.variable |url-status=live }}</ref> Например: | |||
<source lang="php" line="1"> | |||
$a = 'I am a'; // Запись значения в переменную $a | |||
echo $a; // Вывод переменной $а | |||
$b = 'a'; | |||
echo $$b; // Вывод переменной $а (дополнительный $ перед переменной $b) | |||
echo ${'a'}; // Вывод переменной $a | |||
function_name(); // Вызов функции function_name | |||
$c = 'function_name'; | |||
$c(); //Вызов функции function_name | |||
$d = 'ClassName'; | |||
$obj = new ClassName(); // Создание объекта класса ClassName | |||
$obj = new $d(); // Создание объекта класса ClassName | |||
$obj->b; // Обращение к свойству b объекта | |||
$obj->c(); // Вызов метода c() объекта | |||
$obj->$b; // Обращение к свойству "a" объекта, так как $b = 'a' | |||
$obj->$c(); // Вызов метода function_name() объекта, так как $c = 'function_name' | |||
</source> | |||
В PHP <code>echo</code> и <code>print</code> хоть и выглядят похоже на функции, однако первое является оператором<ref>{{Cite web |url=http://ru.php.net/manual/en/function.echo.php |title=PHP: echo — Manual |access-date=2010-01-14 |archive-date=2009-02-24 |archive-url=https://web.archive.org/web/20090224015338/http://ru.php.net/manual/en/function.echo.php |url-status=live }}</ref>, а второе выражением (то есть <code>print</code> возвращает значение, в отличие от <code>echo</code>). При их использовании можно опустить скобки. | |||
<source lang="php" line="1"> | |||
$array = [1, 2, 3]; | |||
array_walk($array, fn (int $value) => print $value); | |||
// Напечатает: 123 | |||
array_walk($array, fn (int $value) => echo $value); | |||
// Ошибка: Syntax error, unexpected token "echo" | |||
// Так как тело коротких анонимных функций допускает только выражения. | |||
</source> | |||
=== Суперглобальные массивы === | |||
Суперглобальными массивами ({{lang-en|Superglobal arrays}}) в PHP называются предопределённые массивы, имеющие глобальную область видимости без использования директивы <code>global</code>. Большая часть этих массивов содержит входные данные запроса пользователя (параметры [[HTTP#GET|GET]]-запроса, поля форм при посылке методом [[HTTP#POST|POST]], [[HTTP cookie|куки]] и т. п.). | |||
Все суперглобальные массивы, кроме <code>$GLOBALS</code> и <code>$_REQUEST</code>, имеют устаревшие аналоги с длинными именами, которые доступны вплоть до версии 5.3. х (начиная с 5.4.0 были удалены). Таким образом, обращения <code>$_GET['year']</code> и <code>$HTTP_GET_VARS['year']</code> идентичны (за исключением области видимости: массивы с «длинными» именами не являются суперглобальными). | |||
; <code>$GLOBALS</code> | |||
: Массив всех глобальных переменных (в том числе и пользовательских). | |||
; <code>$_SERVER</code> (аналог для устаревшего — <code>$HTTP_SERVER_VARS</code>) | |||
: Содержит переменные окружения, которые операционная система передаёт серверу. | |||
; <code>$_ENV</code> (уст. <code>$HTTP_ENV_VARS</code>) | |||
: Текущие [[переменные среды]] ({{lang-en|Environment variables}}). Их набор специфичен для платформы, на которой выполняется скрипт. | |||
; <code>$_GET</code> (уст. <code>$HTTP_GET_VARS</code>) | |||
: Содержит параметры GET-запроса, переданные в URI после знака вопроса «<code>?</code>». | |||
; <code>$_POST</code> (уст. <code>$HTTP_POST_VARS</code>) | |||
: Ассоциативный массив значений полей HTML-формы при отправке методом POST. Индексы элементов соответствуют значению свойства <code>name</code> объектов (кнопки, формы, радиокнопки, флажки и т. д.) HTML-формы. | |||
; <code>$_FILES</code> (уст. <code>$HTTP_POST_FILES</code>) | |||
: Ассоциативный массив со сведениями об отправленных методом POST файлах. Каждый элемент имеет индекс, идентичный значению атрибута «name» в форме, и, в свою очередь, также является массивом со следующими элементами: | |||
:* <code>['name']</code> — исходное имя файла на компьютере пользователя. | |||
:* <code>['type']</code> — указанный агентом пользователя [[MIME]]-тип файла. PHP не проверяет его, и поэтому нет никаких гарантий, что указанный тип соответствует действительности. | |||
:* <code>['size']</code> — размер файла в байтах. | |||
:* <code>['tmp_name']</code> — полный путь к файлу во временной папке. Файл необходимо переместить оттуда функцией <code>move_uploaded_file</code>. Загруженные файлы из временной папки PHP удаляет самостоятельно. | |||
:* <code>['error']</code> — код ошибки. Если файл удачно загрузился, то этот элемент будет равен 0 (<code>UPLOAD_ERR_OK</code>). | |||
;<code>$_COOKIE</code> (уст. <code>$HTTP_COOKIE_VARS</code>) | |||
: Ассоциативный массив с переданными агентом пользователя значениями [[HTTP cookie|куки]]. | |||
;<code>$_REQUEST</code> | |||
: Содержит элементы из массивов <code>$_GET</code>, <code>$_POST</code>, <code>$_COOKIE</code>. С версии PHP 4.1 включает <code>$_FILES</code>. | |||
;<code>$_SESSION</code> (уст. <code>$HTTP_SESSION_VARS</code>) | |||
: Содержит данные сессии. | |||
=== Объектно-ориентированное программирование === | |||
Ключевое слово <code>class</code> было зарезервировано ещё в третьей версии языка. | |||
В четвёртой версии стало возможно создавать классы и объекты на их основе. Однако принципы ООП поддерживались лишь частично, так например, все члены (переменные и методы) были открыты. К тому же создание объектов было дорогой операцией и работало медленно. | |||
Начиная с пятой версии PHP обладает полной поддержкой [[Объектно-ориентированное программирование|ООП]]. Работа с классами была оптимизирована и теперь такой код работает достаточно быстро. | |||
[[Класс (программирование)|Класс]] в PHP объявляется с помощью ключевого слова <code>class</code>. Методы и свойства класса могут быть общедоступными (<code>public</code>, по умолчанию), защищёнными (<code>protected</code>) и скрытыми (<code>private</code>). PHP поддерживает все три основных механизма ООП — [[инкапсуляция (программирование)|инкапсуляцию]], [[полиморфизм подтипов]] и [[Наследование (программирование)|наследование]] (родительский класс указывается с помощью ключевого слова <code>extends</code> после имени класса). Поддерживаются [[Интерфейс (ООП)|интерфейсы]] (ставятся в соответствие с помощью <code>implements</code>). Разрешается объявление [[Листовой класс|финальных]], [[абстрактный метод|абстрактных методов]] и классов. [[Наследование (программирование)#Множественное наследование|Множественное наследование]] классов не поддерживается, однако класс может реализовывать несколько интерфейсов. Для обращения к методам родительского класса используется ключевое слово <code>parent</code>. | |||
Начиная с версии 5.4.0 множественное наследование может быть реализовано с помощью механизма ''особенностей'' ({{lang-en|trait}}). Особенности похожи на примеси ({{lang-en|mixins}}), за исключением того что для них нельзя напрямую создать экземпляр. Повторное использование кода заключено в использовании кода особенности в нескольких классах. Допускается использовать в одном классе несколько особенностей. Механизм особенностей имеет средства разрешения конфликтов имён. При запуске программы код особенности будет «вкомпилирован» в код содержащего его класса. | |||
Классы в PHP имеют ряд «магических» методов ({{lang-en|magic methods}}), начинающихся с двух символов подчёркивания — [[Конструктор (объектно-ориентированное программирование)|конструктор]] (<code>__construct()</code>, в версиях до 5.0 конструктором служил метод, одноимённый с классом) и [[деструктор]] (<code>__destruct()</code>), а также методы чтения (<code>__get()</code>) и записи (<code>__set()</code>), свёртывания (<code>__sleep()</code>) и развёртывания (<code>__wakeup()</code>), клонирования (<code>__clone()</code>) и др. Эти методы являются достаточно гибким инструментом: переопределяя их, можно добиться существенного изменения поведения объекта. | |||
Все функции-члены реализованы виртуальными и потому все они являются методами. | |||
Экземпляры класса создаются с помощью ключевого слова <code>new</code>, обращение к [[Поле класса|полям]] и методам объекта производится с использованием оператора '''<code>-></code>'''. Для доступа к членам класса из его методов используется переменная <code>$this</code>. | |||
<source lang="php" line="1"> | |||
class C1 extends C2 implements I1, I2 | |||
{ | |||
private int $a; | |||
protected int $b; | |||
public function __construct(int $a, int $b) | |||
{ | |||
parent::__construct($a, $b); | |||
$this->a = $a; | |||
$this->b = $b; | |||
} | |||
public function plus(): int | |||
{ | |||
return $this->a + $this->b; | |||
} | |||
/* ............... */ | |||
} | |||
= | $d = new C1(1, 2); | ||
echo $d->plus(); // 3 | |||
</source> | |||
Начиная с пятой версии PHP объекты передаются по указателю: | |||
<source lang="php" line="1"> | |||
class A | |||
{ | |||
public string $color = 'red'; | |||
} | |||
=== | $a = new A(); | ||
echo $a->color; // red | |||
$b = $a; | |||
$b->color = 'blue'; | |||
echo $a->color; // blue | |||
</source> | |||
== | Иногда также можно встретить упоминание, что объекты передаются по ссылке, однако это не так. Так как в PHP отсутствует понятие «указателя», то может применяться терминология «передачи по ссылке» в контексте передачи объектов в качестве аргументов функций или методов из-за схожести поведения. Отличия между передачей объектов по ссылке и по указателю выглядят следующим образом: <source lang="php" line="1"> | ||
{ | class A {} | ||
= | function by_pointer(A $object): void | ||
{ | |||
$object = 42; | |||
} | |||
function by_reference(A &$object): void | |||
{ | |||
$object = 42; | |||
} | |||
= | $object = new A(); | ||
// Передача по указателю | |||
by_pointer($object); | |||
var_dump($object); // object(A) {} | |||
// Передача по ссылке | |||
by_reference($object); | |||
var_dump($object); // int(42) | |||
</source> | |||
==== | {{anchor|Nekudotayim}} | ||
'''«Paamayim Nekudotayim»''' ([[иврит]]: פעמיים נקודתיים) или просто «двойное двоеточие». Используя эту [[лексема (информатика)|лексему]], программист может обращаться к константам, статическим или перегруженным свойствам или методам класса. | |||
При обращении к этим элементам извне класса программист должен использовать имя этого класса. | |||
«Paamayim Nekudotayim» на первый взгляд может показаться странным словосочетанием для обозначения двойного двоеточия. Однако во время создания Zend Engine версии 0.5 (который входил в PHP3), Andi и Zeev выбрали<ref>По-видимому, позаимствовали из языка [[C++]], где это бинарная форма ''указания области видимости'', конструкция с ним, ''квалифицированным именем'', в данном случае константы.</ref> именно это обозначение. «Paamayim Nekudotayim» действительно значит «двойное двоеточие» (дословно: «два раза двоеточие») на иврите. Это обозначение не менялось ни разу в течение всего времени разработки PHP<ref>{{Cite web |url=http://php.net/manual/en/language.oop5.paamayim-nekudotayim.php |title=http://php.net/manual/en |access-date=2010-03-25 |archive-date=2010-06-12 |archive-url=https://web.archive.org/web/20100612091817/http://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php |url-status=live }}</ref>. | |||
<source lang="php" line="1"> | |||
class MyClass | |||
{ | |||
public const CONST_VALUE = 'Значение константы'; | |||
} | |||
// Использование :: вне объявления класса | |||
echo MyClass::CONST_VALUE; | |||
</source> | |||
=== | == Особенности интерпретатора == | ||
{{ | PHP-скрипты обычно обрабатываются [[интерпретатор]]ом в порядке, обеспечивающем [[кроссплатформенность]] разработанного приложения: | ||
| | # [[лексический анализ]] [[Исходный код|исходного кода]] и генерация [[лексема (информатика)|лексем]], | ||
| | # [[синтаксический анализ]] полученных лексем, | ||
| | # генерация [https://www.php.net/manual/ro/internals2.opcodes.php опкода] для виртуальной машины (разновидность [[байт-код]]а), | ||
| | # оптимизация (например [[Удаление мёртвого кода|DCE]]), | ||
| | # выполнение опкода интерпретатором (без создания [[исполняемый файл|исполняемого файла]]), либо [[JIT-компиляция]] результата с последующим выполнением (для включения JIT требуется специальный флаг в настройках интерпретатора). | ||
| | |||
| | Раньше, для увеличения быстродействия приложений было возможно использование специального [[программное обеспечение|программного обеспечения]], так называемых [[Акселератор PHP|акселераторов]]. Принцип их работы заключается в [[кэширование|кэшировании]] однажды сгенерированного байт-кода в [[оперативная память|памяти]] и/или на [[жёсткий диск|диске]], таким образом, из процесса работы приложения исключаются этапы 1—3, что в общем случае ведёт к значительному ускорению работы. Начиная с версии 5.5 одна из разновидностей акселераторов, [[Акселератор PHP|opcache]], была встроена в ядро, поэтому сторонние решения больше не пользуются популярностью. | ||
| | |||
| | Важной особенностью является то, что разработчику нет необходимости заботиться о распределении и [[Сборка мусора (программирование)|освобождении]] памяти. Ядро PHP реализует средства для автоматического управления памятью; вся выделенная память возвращается системе после завершения работы скрипта<ref>{{cite web|url=http://ua.php.net/manual/en/internals2.memory.management.php |title=PHP: Basic memory management — Manual |date=2009-11-13 |lang=ru |access-date=2009-11-17 |archive-url=https://www.webcitation.org/616Xk37JK?url=http://ua.php.net/manual/en/internals2.memory.management.php |archive-date=2011-08-21 }}</ref>. | ||
| | |||
| | === Расширения === | ||
| | Интерпретатор состоит из [[Zend Engine|ядра]] и подключаемых [[Модуль (программирование)|модулей]], ''«расширений»'', представляющих собой динамические [[Библиотека (программирование)|библиотеки]]. Расширения позволяют дополнить базовые возможности языка, предоставляя возможности для работы с [[Система управления базами данных|базами данных]], [[Сокет (программный интерфейс)|сокетами]], динамической [[компьютерная графика|графикой]], [[криптография|криптографическими]] библиотеками, документами формата [[PDF]] и тому подобным. Любой желающий может разработать своё собственное расширение и подключить его. Существует огромное количество расширений, как стандартных, так и созданных сторонними компаниями и энтузиастами, однако в стандартную поставку входит лишь несколько десятков хорошо зарекомендовавших себя. Множество расширений доступно в репозитории [[PECL]]. | ||
| | |||
Начиная с версии 7.4.0 в PHP была добавлена поддержка [[Интерфейс внешних функций|интерфейса внешних функций]] (FFI), что в значительной степени упростило взаимодействие с библиотеками, написанными на любом другом языке (включая API, предоставляемое операционной системой). Этот новый функционал, в свою очередь, предоставил альтернативу написанию расширений. Таким образом, используя FFI можно писать код на языке PHP и взаимодействовать с любыми библиотеками в системе, которые предоставляют <code>cdecl</code>, <code>fastcall</code> или <code>stdcall</code> [[Соглашение о вызове|ABI]]. | |||
=== Параметры настройки === | |||
Интерпретатор PHP имеет специальный [[конфигурационный файл]] — <code>php.ini</code>, содержащий множество настроек, изменение которых влияет на поведение интерпретатора<ref>{{cite web|url=http://ua.php.net/manual/en/ini.php |title=PHP: php.ini directives — Manual |date=2009-11-06 |lang=en |access-date=2009-11-13 |archive-url=https://www.webcitation.org/616Xkcrhr?url=http://ua.php.net/manual/en/ini.php |archive-date=2011-08-21 }}</ref>. Имеется возможность отключить использование ряда функций, изменить ограничения на используемую скриптом оперативную память, время выполнения, объём загружаемых файлов, настроить журналирование ошибок, работу с сессиями и почтовыми сервисами, подключить дополнительные расширения, а также многое другое. Возможно дробление большого конфигурационного файла на части. Например, широко распространена практика вынесения настроек расширений в отдельные файлы. Параметры интерпретатора могут быть переопределены в файлах конфигурации [[HTTP-сервер]]а (например, <code>.htaccess</code> в [[Apache HTTP Server|Apache]]) или в самом скрипте во время выполнения при помощи команды <code>ini_set</code><ref>{{cite web|url=http://ua.php.net/manual/en/ini.list.php |title=PHP: List of php.ini directives — Manual |date=2009-11-06 |lang=en |access-date=2009-11-13 |archive-url=https://www.webcitation.org/616XlBAvP?url=http://ua.php.net/manual/en/ini.list.php |archive-date=2011-08-21 }}</ref>. | |||
=== Режимы запуска интерпретатора (SAPI) === | |||
SAPI — это внешний [[Уровень абстракции (программирование)|уровень абстракции]], предназначенный для встраивания интерпретатора в другие приложения и отвечает за его работу (запуск, остановка, передача скриптов на исполнение, доступ к внешним данным). Существует несколько основных SAPI, определяющих способы запуска и использования PHP: | |||
# В качестве модуля к [[веб-сервер]]у (например, для [[Apache HTTP Server|Apache]] модуль <code>mod_php</code>). В этом случае интерпретатор PHP выполняется в [[Операционное окружение|окружении]] [[Процесс (информатика)|процесса]] веб-сервера. Веб-сервер управляет количеством запущенных процессов PHP и сообщает им, какие скрипты требуется исполнить. | |||
# [[CGI]] SAPI. Использование CGI подразумевает запуск нового процесса для обработки каждого запроса. Для исполнения PHP-скрипта веб-сервер запускает <code>./php-cgi /path/to/script.php</code> . Сам принцип такого использования подразумевает, что интерпретатор 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. | |||
# В качестве [[Интерфейс командной строки|скрипта командной строки]] (CLI SAPI), являющегося [[исполняемый файл|исполняемым файлом]], который вызывается пользователем из [[Интерфейс командной строки|командной строки]]; скрипт выполняется в окружении вызвавшего пользователя. В этом случае возможно использование PHP для создания клиентских [[GUI]]-приложений<ref>{{cite web|url=http://docs.php.net/manual/ru/features.commandline.php |title=PHP: Использование PHP в командной строке — Manual |date=2009-06-21 |lang=ru |access-date=2009-11-13 |archive-url=https://www.webcitation.org/616XmPeqJ?url=http://docs.php.net/manual/ru/features.commandline.php |archive-date=2011-08-21 }}</ref> и решения административных задач в [[операционная система|операционных системах]] [[UNIX]], [[Linux]], [[Microsoft Windows]], [[Mac OS X]] и [[AmigaOS]]. Однако в таком качестве он не получил распространения, отдавая пальму первенства [[Perl]], [[Python]] и [[VBScript]]. | |||
Начиная с версии PHP 5.4.0 в CLI SAPI появилась возможность запуска PHP как отдельного HTTP-сервера. Однако этот режим предназначен исключительно для разработки, так как запускает только один процесс интерпретатора и выполняет все запросы исключительно последовательно. | |||
=== Пасхальные яйца === | |||
PHP имеет несколько [[пасхальное яйцо (виртуальное)|пасхальных яиц]] (шуток). Передача специальных GET-параметров любому php-скрипту приводит к выводу различных изображений. | |||
Например: | |||
любой_сценарий.php?=PHPE9568F36-D428-11d2-A769-00AA001ACF42 | |||
при вводе этого значения в адресную строку браузера можно увидеть различные изображения, в зависимости от версии интерпретатора: | |||
# фотография ''Thies Arntzen'' (версии 4.1.2, 4.2.2) | |||
# фотография [[Такса|таксы]] (владелец ''Stig Bakken'') (версии 4.3.2, 4.3.3, 4.3.8 — 4.3.10) | |||
# фотография чёрного [[терьер]]а (владелец ''Zeev Suraski'') (версии 4.3.11, 4.4.0 — 4.4.4, 5.1.0, 5.1.2) | |||
# фотография [[кролик]]а (версии 4.3.1, 5.0.0, 5.0.3) | |||
# искажённый логотип PHP (версии 5.1.3 — 5.2.13)<ref name="0php_eeggs">{{cite web|url=http://www.0php.com/php_easter_egg.php |title=PHP Easter Egg |lang=en |access-date=2009-11-16 |archive-url=https://www.webcitation.org/616b44t2j?url=http://www.0php.com/php_easter_egg.php |archive-date=2011-08-21 }}</ref> | |||
# фотография игрушечного синего слона с надписью PHP (начиная с версии 5.3.0)<ref name="0php_eeggs"/> | |||
Следующие два значения позволят увидеть стандартный логотип PHP и ZEND, соответственно<ref name="0php_eeggs"/>: | |||
любой_сценарий.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 | |||
любой_сценарий.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 | |||
Эти значения можно получить и непосредственно в PHP-скрипте с помощью функций <code>php_logo_guid</code> и <code>zend_logo_guid</code> для логотипа Zend. | |||
Также имеется специальное значение для отображения списка всех авторов PHP (4,5)<ref name="0php_eeggs"/>: | |||
любой_сценарий.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000 | |||
=== Альтернативные реализации === | |||
В силу популярности языка PHP и желания увеличить быстродействие основанных на нём [[веб-приложение|веб-приложений]] создано несколько альтернативных [[компилятор]]ов, близких к PHP-языку. Так в феврале [[2010 год]]а компания [[Facebook]] открыла<ref>[https://web.archive.org/web/20100213220056/http://developers.facebook.com/news.php?blog=1&story=358 HipHop for PHP: Move Fast]</ref><ref>{{Cite web |url=http://www.opennet.ru/opennews/art.shtml?num=25268 |title=Компания Facebook открыла код высокопроизводительного PHP транслятора |access-date=2010-02-03 |archive-date=2010-02-06 |archive-url=https://web.archive.org/web/20100206010512/http://www.opennet.ru/opennews/art.shtml?num=25268 |url-status=live }}</ref> свой компилятор PHP — [[HipHop (информатика)|HipHop]] (HPHP, Hyper-PHP) генерирующий код на [[C++]], с последующей компиляцией в машинный код с помощью [[gcc]]. В июле 2013 года [[Россия|российская]] компания [[ВКонтакте]] анонсировала похожий продукт — [[KPHP]]<ref name="хакер">{{Cite web |url=http://www.xakep.ru/post/60942/ |title=Павел Дуров с коллегами разработали улучшенную версию PHP |access-date=2014-01-02 |archive-date=2013-12-12 |archive-url=https://web.archive.org/web/20131212142255/http://www.xakep.ru/post/60942/ |url-status=live }}</ref>. | |||
В таблице представлен список существующих на сегодняшний момент альтернативных реализаций. | |||
{| class="standard" | |||
|+ | |||
! |Название | |||
! |Версия PHP (примерно) | |||
! |Лицензия | |||
! |Результат компиляции | |||
|- | |||
|[[KPHP]] | |||
|7.4 | |||
|[[GPL]] | |||
|[[C++]], [[машинный код]] | |||
|- | |||
|[[HipHop (информатика)|HipHop]] | |||
|5.4 | |||
|[[PHP License]] | |||
|[[C++]], [[машинный код]] | |||
|- | |||
| [[Roadsend PHP]] | |||
| 5.3 | |||
| [[GPL]]/[[LGPL]] | |||
| [[Си (язык программирования)|C]], [[машинный код]] | |||
|- | |||
| [[Phalanger]] | |||
| 5.5 | |||
| Ms SS-PL<ref>[http://www.codeplex.com/license?ProjectName=Phalanger Текст лицензии]{{ref|en}}</ref> ([[Shared source]]) | |||
| [[MSIL|Microsoft IL]] | |||
|- | |||
| Quercus (в составе [[веб-сервер]]а [[Resin]]) | |||
| 5.2 | |||
| [[GPL]] или коммерческая<!-- ref>В OpenSource версии PHP интерпретируется. Компиляция включена только в коммерческую profession-версию</ref не проверено--> | |||
| [[JVM]] | |||
|- | |||
| PHC | |||
| 5.2 | |||
| [[BSDL]] | |||
| [[Си (язык программирования)|C]], [[машинный код]] | |||
|- | |||
| Pipp<ref>Проект находится в экспериментальной стадии</ref> | |||
| 5.3 | |||
| [[Artistic License]] и [[GNU GPL]] | |||
| [[Parrot]] | |||
|- | |||
| JPHP<ref>Проект находится в экспериментальной стадии. Последняя версия 1.3.1 (по состоянию на июль 2020 года)</ref> | |||
| 7.1 (частично 7.2, 7.3 и 7.4)<ref>{{Cite web|url=https://github.com/jphp-group/jphp#features|title=jphp-group/jphp|publisher=GitHub|lang=en|access-date=2018-11-18|archive-date=2018-10-05|archive-url=https://web.archive.org/web/20181005072637/https://github.com/jphp-group/jphp#features|url-status=live}}</ref> | |||
| [[Лицензия Apache|Apache 2.0]] | |||
| [[JVM]] | |||
|- | |||
| PHPPHP | |||
| 5.4 | |||
| [[Лицензия MIT|MIT]] | |||
| PHP | |||
|- | |||
| PH7 | |||
| 5.5 | |||
| Своя (Symisc Public License) | |||
| [[Си (язык программирования)|C]], [[машинный код]] | |||
|- | |||
| HippyVM | |||
| 5.6 | |||
| [[Лицензия MIT|MIT]] | |||
| [[PyPy|RPython/PyPy]] | |||
|} | |||
На сайте phpclasses.org доступен сравнительный анализ некоторых компиляторов<ref>{{Cite web |url=http://www.phpclasses.org/blog/post/117-PHP-compiler-performance.html |title=PHP compiler performance |access-date=2010-03-01 |archive-date=2010-02-26 |archive-url=https://web.archive.org/web/20100226134943/http://www.phpclasses.org/blog/post/117-PHP-compiler-performance.html |url-status=live }}</ref>. | |||
== Лицензирование == | |||
{{главная|Лицензия PHP}} | |||
== Экосистема == | |||
{{главная|Linux|Apache HTTP Server|Nginx|MySQL|PhpMyAdmin }} | |||
=== Фреймворки === | |||
{{главная|Laravel|Symfony|Yii|CodeIgniter|CakePHP|Phalcon PHP|Spiral Framework}} | |||
=== Системы управления содержимым === | |||
{{главная|WordPress|Joomla!|Drupal|TYPO3}} | |||
Язык PHP является самым популярным языком для разработки систем управления содержимым (Content management system, CMS). | |||
=== Средства для разработки PHP-приложений === | |||
{{главная|PhpStorm|NetBeans IDE|PHP Development Tools|Xdebug}} | |||
{| class="standard" | |||
|+ | |||
! |Название | |||
! |Лицензия | |||
|- | |||
|[[Codelobster]] | |||
|[[Freeware]] | |||
|----- | |||
| [[Komodo]] | |||
| [[Mozilla tri-license]] ([[Mozilla Public License|MPL]]/[[GNU LGPL|LGPL]]/[[GNU General Public License|GPL]])<ref>{{Cite web |url=http://www.activestate.com/Products/komodo_ide/komodo_edit.mhtml |title=Komodo IDE is a Professional Development Environment for Perl, Python, Tcl {{!}} ActiveState |access-date=2011-11-22 |archive-url=https://web.archive.org/web/20081220113822/http://activestate.com/Products/komodo_ide/komodo_edit.mhtml |archive-date=2008-12-20 |url-status=dead }}</ref> | |||
|----- | |||
| [[PhpStorm]] | |||
| [[Proprietary software]] | |||
|----- | |||
| [[PHP Development Tools]] | |||
| [[Eclipse Public License]] | |||
|----- | |||
| [[Zend Studio]] | |||
| [[Условно-бесплатное программное обеспечение|Shareware]] | |||
|----- | |||
| [[Aptana Studio]] | |||
| [[GNU GPL]] | |||
|----- | |||
| [[phpDesigner]] | |||
| [[Условно-бесплатное программное обеспечение|Shareware]] | |||
|----- | |||
| [[PHP Expert Editor]] | |||
| [[Условно-бесплатное программное обеспечение|Shareware]]<ref>Предусмотрена бесплатная регистрация для граждан exUSSR</ref> | |||
|----- | |||
| [[NetBeans IDE]] | |||
| [[CDDL]] | |||
|----- | |||
| [[RadPHP XE]] | |||
| [[Trial]] | |||
|----- | |||
| [[NuSphere]] | |||
| [[Trial]] | |||
|----- | |||
| [[KDevelop]]<ref>{{Cite web |url=http://milianw.de/blog/php-support-for-kdevelop-4-and-eventually-quanta |title=PHP support for KDevelop 4 (and eventually Quanta+) {{!}} Milian Wolff |access-date=2010-12-11 |archive-date=2011-01-02 |archive-url=https://web.archive.org/web/20110102090858/http://milianw.de/blog/php-support-for-kdevelop-4-and-eventually-quanta |url-status=live }}</ref> | |||
| [[GNU GPL]] | |||
|----- | |||
| [[Microsoft WebMatrix]] | |||
| [[Freeware]] | |||
|----- | |||
| [[Notepad++]] | |||
| [[GNU GPL]] | |||
|----- | |||
|[[Sublime Text]] | |||
| [[Proprietary software]] | |||
|----- | |||
| VS.Php for Visual Studio | |||
| [[Proprietary software]] | |||
|- | |||
|PHP Tools for Visual Studio | |||
|Trial | |||
|----- | |||
| [[DevelNext]] | |||
| [[MPL-2.0]] | |||
|----- | |||
| [[jEdit]] | |||
| [[GNU GPL]]-2.0 | |||
|----- | |||
|+ | |||
|} | |||
== Стандартные рекомендации PHP == | |||
'''Стандартные рекомендации PHP''' ({{lang-en|PHP Standard Recommendation}}, сокр. {{iw|Стандартные рекомендации PHP|PSR|en|PHP Standard Recommendation}}) — это спецификация PHP, которая разрабатывается, принимается и публикуется группой авторитетных PHP проектов в том числе | |||
CakePHP, [[Composer]], Joomla, [[PEAR]], Phalcon, [[phpDocumentor]], TYPO3, Yii framework<ref>{{cite web|url=https://www.php-fig.org/personnel/|title=Personnel|lang=en|access-date=2020-08-01|url-status=live|archive-url=https://web.archive.org/web/20200602212311/https://www.php-fig.org/personnel/|archive-date=2020-06-02}}</ref>. Спецификация служит стандартизацией концепций программирования на языке PHP и основана на реальном опыте, а также на исследованиях и экспериментах<ref>{{cite web|url=https://www.php-fig.org/bylaws/mission-and-structure/|title=Mission and Structure|lang=en|access-date=2020-08-01|url-status=live|archive-url=https://web.archive.org/web/20200801151144/https://www.php-fig.org/bylaws/mission-and-structure/|archive-date=2020-08-01}}</ref>. Цель рекомендаций состоит в том, чтобы обеспечить совместимость компонентов [[Веб-приложение|веб-приложений]] разработанных разными разработчиками. | |||
== Критика == | |||
Сторонники языка PHP в качестве основных его преимуществ называют широкую распространённость, востребованность PHP-разработчиков на рынке труда и простоту изучения. К достоинствам языка относится и его достаточно быстрая эволюция. | |||
=== Отсутствие поддержки многобайтовых кодировок в ядре языка === | |||
Поддержка [[Юникод|строк с многобайтовыми кодировками]] (такими как [[UTF-8]]) реализуется через отдельные расширения <code>mbstring</code> и <code>iconv</code>, на уровне ядра поддержка отсутствует, однако с версии PHP 4.2.0 есть возможность переопределять стандартные функции работы со строками, подменяя их на аналоги из mbstring. | |||
Поддержка многобайтовых кодировок во всех строковых функциях стала доступна с версии 5.4.0 (март 2012 года). | |||
=== Отсутствие поддержки многопоточности === | |||
В языке не предусмотрена возможность создания [[многопоточность|многопоточных]] приложений и отсутствует поддержка синхронизированного доступа к ресурсам, однако реализуема при помощи расширения PCNTL<ref>{{Cite web |url=http://php.net/manual/en/book.pcntl.php |title=PCNTL |access-date=2012-01-23 |archive-date=2012-01-17 |archive-url=https://web.archive.org/web/20120117103539/http://www.php.net/manual/en/book.pcntl.php |url-status=live }}</ref> (от {{lang-en|process control}}), но оно не подходит для решения специфических задач. | |||
Хотя есть возможность установить расширение pthreads для «честных» потоков, но для этого интерпретатор должен быть скомпилирован с флагом thread safety, а само расширение признано устаревшим в пользу parallel (от того же автора). | |||
В качестве более современной альтернативы возможно использование расширения Swoole. | |||
== См. также == | |||
{{Навигация}} | |||
* [[Стандартная библиотека PHP]] | |||
* [[PHP-Qt]] | |||
* [[PHP-GTK]] | |||
* [[Акселератор PHP]] | |||
* [[PHP-инъекция]] | |||
* [[PHPUnit]] | |||
* [[Selenium]] | |||
* {{iw|DevTools|DevTools|en|Web development tools}} | |||
* [[Регулярные выражения]] | |||
== Примечания == | |||
{{примечания|2}} | |||
== Литература == | |||
* {{книга | |||
|заглавие = PHP: объекты, шаблоны и методики программирования | |||
|издание = 3-е издание | |||
|оригинал = PHP Objects, Patterns and Practice, Third Edition | |||
|автор = Мэтт Зандстра | |||
|страницы = 560 | |||
|isbn = 978-5-8459-1689-1 | |||
|год = 2010 | |||
|место = {{М}} | |||
|издательство = «[[Вильямс (издательство)|Вильямс]]» | |||
}} | }} | ||
* {{книга | |||
|автор = Кристиан Дари, Эмилиан Баланеску | |||
|часть = | |||
|заглавие = 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 | |||
|автор = Джейсон Ленгсторф | |||
|страницы = 352 | |||
|isbn = 978-5-8459-1693-8 | |||
|год = 2010 | |||
|место = М. | |||
|издательство = «[[Вильямс (издательство)|Вильямс]]» | |||
}} | |||
* {{книга | |||
|заглавие = Web 2.0: создание приложений на PHP | |||
|оригинал = Practical Web 2.0 Applications with PHP | |||
|автор = Квентин Зервас | |||
|страницы = 544 | |||
|isbn = 978-5-8459-1590-0 | |||
|год = 2009 | |||
|место = {{М}} | |||
|издательство = «[[Вильямс (издательство)|Вильямс]]» | |||
}} | |||
* {{книга | |||
|автор = Кузнецов Максим, Симдянов Игорь | |||
|часть = | |||
|заглавие = 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 | |||
|ссылка = https://archive.org/details/phpmysqlwebdevel0000well | |||
|оригинал = | |||
|издание = 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 | |||
}} | |||
* {{книга | |||
|автор = Zandstra M | |||
|часть = | |||
|заглавие = PHP Objects, Patterns, and Practice | |||
|ссылка = https://archive.org/details/phpobjectspatter0000zand_c5z1 | |||
|оригинал = | |||
|издание = 5th Edition | |||
|место = | |||
|издательство = «[[Apress (издательство)|Apress]]» | |||
|год = 2016 | |||
|страницы = [https://archive.org/details/phpobjectspatter0000zand_c5z1/page/583 583] | |||
|isbn = 978-1-4842-1995-9 | |||
}} | |||
* {{книга | |||
|автор = Никсон Р. | |||
|часть = | |||
|заглавие = Создаём динамические веб-сайты с помощью 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 | |||
}} | |||
== Ссылки == | |||
* [https://www.php.net/ Официальный сайт PHP]{{ref|en}} | |||
* [https://www.php.net/manual/ru/ Руководство по PHP]{{ref|ru}} (включая FAQ) | |||
* {{cite web|title=DesignPatternsPHP 1.0|url=https://designpatternsphp.readthedocs.io/ru/latest/|website=readthedocs.io|lang=ru|archive-url=https://web.archive.org/web/20230326080039/https://designpatternsphp.readthedocs.io/ru/latest/README.html|archive-date=2023-03-26|url-status=unfit}} | |||
* [https://www.php-fig.org/ PHP-fig стандарты PSR] | |||
* [https://docs.google.com/presentation/d/10AU4d93b2VC8ihJYdOGx85eQAWGaas9LHS2erS0XFHo/edit#slide=id.p1 Презентация о стандартах PSR] | |||
= | {{внешние ссылки}} | ||
{{нет сносок|дата=2014-11-21}} | |||
{{ | {{PHP}} | ||
{{FOSS}} | |||
{{Протоколы взаимодействия}} | |||
[[Категория:PHP| ]] | |||
[[Категория:Скриптовые языки]] | |||
[[Категория:Языки веб-программирования]] | |||
[[Категория:Свободные компиляторы и интерпретаторы]] | |||
[[Категория:Статьи с примерами кода PHP]] | |||
[[Категория:Гипертекст]] | |||
[[Категория:Высокоуровневые языки программирования]] | |||
[[Категория:Языки с динамической типизацией]] | |||
Текущая версия от 20:16, 30 марта 2026
Шаблон:Значения Шаблон:Карточка языка программирования
PHP (англ. Шаблон:Lang-en2 — «PHP: препроцессор гипертекста»; первоначально PHP/FI (Personal Home Page / Form Interpreter), а позже названный Шаблон:Lang-en2<ref name="off_history">Шаблон:Cite web</ref> — «Инструменты для создания персональных веб-страниц») — скриптовый язык<ref>Шаблон:Cite web</ref> общего назначения, интенсивно применяемый для разработки веб-приложений. В настоящее время поддерживается подавляющим большинством хостинг-провайдеров и является одним из лидеров среди языков, применяющихся для создания динамических веб-сайтов<ref name="tiobe">Шаблон:Cite web</ref>.
Язык и его интерпретатор (Zend Engine) разрабатываются группой энтузиастов в рамках проекта с открытым кодом<ref>Шаблон:Cite web</ref>. Проект распространяется под собственной лицензией, несовместимой с GNU GPL.
Область применения
В области веб-программирования, в частности, серверной части, PHP — один из популярных сценарных языков (наряду с JSP, Perl и языками, используемыми в ASP.NET).
Популярность в области построения веб-сайтов определяется наличием большого набора встроенных средств и дополнительных модулей для разработки веб-приложений<ref>Шаблон:Cite web</ref>. Основные из них:
- Автоматическое извлечение POST- и GET-параметров, а также переменных окружения веб-сервера в предопределённые массивы;
- Взаимодействие с большим количеством различных систем управления базами данных через дополнительные модули (MySQL, MySQLi, SQLite, PostgreSQL, Oracle Database (OCI8), Microsoft SQL Server, Sybase, ODBC, mSQL, IBM DB2, Cloudscape и Apache Derby, Informix, Ovrimos SQL, Lotus Notes, DB++, DBM, dBase, DBX, FrontBase, FilePro, Ingres II, SESAM, Firebird и InterBase, Paradox File Access, MaxDB, интерфейс PDO, Redis);
- Автоматизированная отправка HTTP-заголовков;
- Работа с HTTP-авторизацией;
- Работа с cookies и сессиями;
- Работа с локальными и удалёнными файлами, сокетами;
- Обработка файлов, загружаемых на сервер;
- Работа с XForms;
- Создание и работа с API;
- Создание приложений с графическим интерфейсом пользователя при использовании фреймворка Qt Designer;
- Создание консольных приложений.
По состоянию на 2022 год используется сотнями тысяч разработчиков; согласно рейтингу корпорации TIOBE, базирующемуся на данных поисковых систем, в декабре 2022 года PHP находился на 10 месте по популярности среди языков программирования<ref name="tiobe" />.
Входит в LAMP — распространённый набор ПО для создания и хостинга веб-сайтов (Linux, Apache, MySQL, PHP), а также LEMP — не менее распространённый набор ПО (Linux, Nginx, MySQL, PHP).
Среди сайтов, использующих PHP — Facebook, Wikipedia, Yahoo!, Baidu.
Также, на PHP написаны такие системы управления сайтами (CMS) и фреймворки (CMF), как Drupal, Joomla, Laravel, Symfony, WordPress, Yii и другие.
Поддержка версий
| Последняя версия ветви | Сроки бесплатной и платной поддержки ветви |
|---|---|
| 8.5.4<ref>PHP: PHP 8.5 Release Announcement</ref> | Шаблон:Start date — Шаблон:End date<ref>PHP: todo:php85</ref>
Завершение Шаблон:Обратный отсчёт Шаблон:Color box PHP LTS до конца 2031. |
| 8.4.19<ref>Шаблон:Cite web</ref> | Шаблон:Start date — Шаблон:End date<ref>Шаблон:Cite web</ref>
Завершение Шаблон:Обратный отсчёт Шаблон:Color box PHP LTS до конца 2030. |
| 8.3.30<ref>Шаблон:Cite web</ref> | Шаблон:Start date — Шаблон:End date<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>.
Завершение Шаблон:Обратный отсчёт Шаблон:Color box PHP LTS до конца 2029. |
| 8.2.30<ref>Шаблон:Cite web</ref> | Шаблон:Start date — Шаблон:End date.
Завершение Шаблон:Обратный отсчёт Шаблон:Color box PHP LTS до конца 2028. |
| 8.1.34<ref>Шаблон:Cite web</ref> | Шаблон:Start date — Шаблон:End date.
Шаблон:Color box PHP LTS до конца 2027<ref name="php-lts">Шаблон:Cite web</ref>. |
| 7.4.33<ref name="автоссылка1" /> | Шаблон:Start date — Шаблон:End date.
Шаблон:Color box PHP LTS до конца 2026<ref name="php-lts"></ref>. |
| 7.3.33<ref name="автоссылка1" /> | Шаблон:Start date — Шаблон:End date.
Шаблон:Color box PHP LTS до конца 2026<ref name="php-lts"></ref>. |
| 7.2.34<ref name="автоссылка1" /> | Шаблон:Start date — Шаблон:End date.
Шаблон:Color box PHP LTS до конца 2026<ref name="php-lts"></ref>. |
| 8.0.30<ref name="автоссылка1">Шаблон:Cite web</ref> | Шаблон:Start date — Шаблон:End date.
Шаблон:Color box PHP LTS до конца 2025<ref name="php-lts"></ref>. |
| Статус поддержки: Шаблон:Color box анонсирована Шаблон:Color box активная Шаблон:Color box временная Шаблон:Color box завершена Шаблон:Color box опционально платная Шаблон:Color box только платная Шаблон:Color box отсутствует | |
Каждая новая минорная ветвь разработки PHP (например, 8.5), разрабатывается в течение одного года и, как правило, в период с ноября по декабрь выходит очередной релиз Шаблон:Color box первоначальной стабильной версии, которая бесплатно поддерживается в течение 4 лет. В течение 2 лет осуществляется Шаблон:Color box активная поддержка ветви, обнаруженные ошибки и проблемы безопасности исправляются и выпускаются обновления в виде регулярных точечных релизов<ref>Шаблон:Cite web</ref>.
После окончания двухлетнего периода активной поддержки каждая ветвь получает Шаблон:Color box временную поддержку в течение ещё 2 дополнительных лет только для критических обновлений, касающихся проблем безопасности. Релизы в течение этого периода выходят по мере необходимости: может быть несколько релизов или ни одного, в зависимости от количества отчётов об ошибках<ref>Шаблон:Cite web</ref>.
Начиная с версии PHP 8.1, по истечении 4 лет с релиза первоначальной стабильной версии, срок поддержки ветви Шаблон:Color box завершается 31 декабря соответствующего года, когда наступает конец жизни ветви — End Of Life, также обозначается EOL и она больше не поддерживается (для PHP 8.1 срок бесплатной поддержки завершился 31 декабря 2025). В случае, если релиз первоначальной стабильной версии выйдет с задержкой (после нового года), то дополнительный год поддержки не предоставляется: например, релиз ветви PHP 8.5 был запланирован на ноябрь 2025 года, но даже если бы произошла задержка и дата релиза была бы перенесена на 2026 год, то срок бесплатной поддержки ветви все равно продлился только до 31 декабря 2029 года<ref>Шаблон:Cite web</ref>. Использование устаревших версий PHP из неподдерживаемых ветвей не рекомендовано, потому что это может привести к уязвимостям в безопасности и ошибкам, которые были исправлены в более поздних версиях<ref>Шаблон:Cite web</ref>.
Zend предлагает платную активную долгосрочную поддержку — PHP Long Term Support (PHP LTS):
- Шаблон:Color box опционально платную для актуальных ветвей PHP;
- Шаблон:Color box только платную для устаревших ветвей PHP.
Срок платной поддержки каждой ветви начиная с релиза первоначальной стабильной версии составляет, как минимум, 5 лет<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>.
Распределение версий PHP
W3Techs сообщает, что по состоянию на 20 февраля 2026 года (3 месяца после релиза PHP 8.5) «PHP используется на 72 % всех веб-сайтов, чей серверный язык программирования мы знаем».<ref>Шаблон:Cite web</ref> Также сообщается, что из всех сайтов, использующих PHP:
- PHP Шаблон:Color box используют 56,6 % пользователей, из которых актуальные ветви с активной или временной бесплатной поддержкой (8.5, 8.4, 8.3 и 8.2) используют 39,11 % пользователей;
- PHP Шаблон:Color box используют 34,3 % пользователей:
- PHP Шаблон:Color box используют 9,0 % пользователей, версии, которые не поддерживаются исправлениями безопасности с 2018 года и, как известно, имеют серьёзные уязвимости.
- PHP Шаблон:Color box используют 0,1 % пользователей, версии, которые также не поддерживаются.
Это означает, что по состоянию на 20 февраля 2026 года подавляющее большинство сайтов — 60,36 %, использующих PHP, могут быть уязвимы для взлома; хотя в рамках PHP LTS от Zend ветви Шаблон:Color box 8.1, Шаблон:Color box 7.4, Шаблон:Color box 7.3 и Шаблон:Color box 7.2 (в совокупности 43,97 %) могут поддерживаться, кроме того некоторые дистрибутивы Linux, такие как Ubuntu и Debian, также предоставляют коммерческую поддержку и платные исправления безопасности, например, для ветви Шаблон:Color box 7.4<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>.
Устаревшие и неподдерживаемые ветви PHP, включая Шаблон:Color box 8.0, Шаблон:Color box 7.1, Шаблон:Color box 7.0, Шаблон:Color box и Шаблон:Color box (в совокупности 16,65 %) настоятельно не рекомендуются к использованию.
Дополнительные возможности
Язык автоматически поддерживает HTTP Cookies в соответствии со стандартами Netscape. Это позволяет проводить установку и чтение небольших сегментов данных на стороне клиента. Работа с Cookies организована посредством сеансов (сессий). У сессий есть срок действия (после его истечения данные удаляются), в сессиях можно хранить и редактировать разные типы данных, в том числе сериализованные — пропущенные через serialize (процесс происходит автоматически), PHP-объекты.
Шаблон:Видимый якорьСоздание GUI-приложений
PHP не ориентирован на создание десктопных приложений, но есть потребность в создании интерфейсов для настройки серверов, беспрерывного выполнения, отладки скриптов (сценариев), управления локальными и тестовыми серверами, и т. п. Из-за этого и возникли решения данной проблемы.
Расширения
Основное использование расширений — надстройки библиотек интерфейсов пользователя (UI-библиотек).
Расширения условно делятся на три группы:
- расширения PHP: WxPHP (Windows, Linux, macOS), Winbinder (Windows);
- обёртки, использующие системные функции средствами интерфейса внешних функций: 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, избавляя от создания обёртки.
Среды разработки (IDE)
Есть место и полноценным средам разработки для 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 к проекту
Также существуют расширения и для противоположного применения — подключения 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)
История<ref>Шаблон:Cite web</ref>
PHP Tools, FI, Construction Kit
Разработка PHP началась в 1993 году<ref>Шаблон:Cite web</ref> когда датский программист Расмус Лердорф разработал на C<ref>Шаблон:Cite web</ref> набор CGI-скриптов для учёта посетителей его онлайн-резюме, обрабатывающий шаблоны HTML-документов. Лердорф назвал набор Personal Home Page Tools (Инструменты для личной домашней страницы). Вскоре функциональности перестало хватать, и Лердорф разработал новый интерпретатор шаблонов PHP/FI (англ. Шаблон:Lang-en2 — «персональная домашняя страница / интерпретатор форм»)<ref>Шаблон:Книга</ref>.
8 июня 1995 года вышел Personal Home Page (PHP Tools) version 1.0 — первый публичный релиз с открытым исходным кодом. Эта новая реализация была способна взаимодействовать с базами данных и многое другое, что создавало фреймворк, с помощью которого пользователи могли создавать простые динамические веб-приложения.
PHP 2
В 1997 году после длительного бета-тестирования вышла вторая версия обработчика, написанного на C — PHP/FI 2.0. Её использовали всего 1 % (приблизительно 50 тысяч) всех интернет-доменов мира<ref name="off_history"/>, так как к моменту выпуска языка в релиз, парсер языка был полностью переписан двумя программистами из Тель-Авива: Энди Гутмансом и Зивом Сураски.
PHP 3 и Zend Engine
Версия PHP 3.0 подверглась значительной переработке, определившей современный облик и стиль языка программирования. В 1997 году два израильских программиста, Энди Гутманс и Зеев Сураски, полностью переписали код интерпретатора. PHP 3.0 был официально выпущен в июне 1998 года<ref name="off_history"/>.
Одной из сильнейших сторон PHP 3.0 была возможность расширения ядра дополнительными модулями. Впоследствии интерфейс написания расширений привлёк к PHP множество сторонних разработчиков, работающих над своими модулями, что дало PHP возможность работать с огромным количеством баз данных, протоколов, поддерживать большое число API. Большое количество разработчиков привело к быстрому развитию языка и стремительному росту его популярности. С этой версии акроним php расшифровывается как «PHP: hypertext Preprocessor», вместо устаревшего «Personal Home Page».
К зиме 1998 года, практически сразу после официального выхода PHP 3.0, Энди Гутманс и Зеев Сураски начали переработку ядра PHP. В задачи входило увеличение производительности сложных приложений и улучшение модульности базиса кода PHP. Новый движок, названный Zend Engine, успешно справлялся с поставленными задачами и впервые был представлен в середине 1999 года.
PHP 4
PHP 4.0, основанный на движке Zend Engine и принёсший с собой набор дополнительных функций, официально вышел в мае 2000 года. В дополнение к улучшению производительности, PHP 4.0 имел ещё несколько ключевых нововведений, таких как поддержка сессий, буферизация вывода, более безопасные способы обработки вводимой пользователем информации и несколько новых языковых конструкций.
PHP 5
PHP 5 вышел 13 июля 2004 года. Изменения включают обновление ядра Zend (Zend Engine 2), что существенно увеличило эффективность интерпретатора. Введена поддержка языка разметки XML. Полностью переработаны функции ООП, которые стали во многом схожи с моделью, используемой в Java. В частности, введён деструктор, открытые, закрытые и защищённые члены и методы, окончательные члены и методы, интерфейсы и клонирование объектов. В последующих версиях также были введены пространства имён, замыкания и целый ряд достаточно серьёзных изменений, количественно и качественно сравнимых с теми, которые появились при переходе на PHP 5.0.
PHP 6
Разработка PHP 6 велась с октября 2006 года<ref>Шаблон:Cite web</ref>. Было сделано множество нововведений<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>, как, например, исключение из ядра регулярных выражений POSIX и «длинных» суперглобальных массивов, удаление директив safe_mode, magic_quotes_gpc и register_globals из конфигурационного файла php.ini. Одним из основных новшеств должна была стать поддержка Юникода<ref name='newphp6'>Шаблон:Cite web</ref>. Однако в марте 2010 года разработка PHP 6 была признана бесперспективной<ref>Как умер PHP6 Шаблон:Wayback // amiro.ru</ref> из-за сложностей с поддержкой Юникода. Исходный код PHP 6 перемещён на ветвь, а основной линией разработки стала версия 5.4.
Шаблон:AnchorPHP 7
В 2014 году было проведено голосование, по результатам которого следующая версия получила название PHP 7<ref>Шаблон:Cite web</ref>. Выход новой версии планировался в середине октября 2015 года<ref>Шаблон:Cite web</ref>. В марте 2015 года Zend представили инфографику, в которой описаны основные нововведения PHP 7<ref>Шаблон:Cite web</ref>.
3 декабря 2015 года было объявлено о выходе PHP версии 7.0.0<ref>Шаблон:Cite web</ref>.
Новая версия основывается на экспериментальной ветви PHP, которая изначально называлась phpng (англ. Шаблон:Lang-en2 «следующее поколение»), и разрабатывалась с упором на увеличение производительности и уменьшение потребления памяти<ref>Шаблон:Cite web</ref>. В новой версии добавлена возможность указывать тип возвращаемых из функции данных<ref>Шаблон:Cite web</ref>, добавлен контроль передаваемых типов для данных<ref>Шаблон:Cite web</ref>, а также новые операторы.
13 июня 2019 вышла версия PHP 7.4. В ядро были добавлены типизированные свойства и стрелочные функции, а также ограниченная ковариантность возвращаемого типа и контравариантность типа аргумента<ref>Шаблон:Cite web</ref>.
PHP 8
PHP версии 8.0 была выпущена 26 ноября 2020-го<ref>Шаблон:Cite web</ref>. Главными нововведениями стали<ref>Шаблон:Cite web</ref>: поддержка union-типов<ref>Шаблон:Cite web</ref>, JIT-компиляция<ref>Шаблон:Cite web</ref> и атрибуты (также известны как аннотации), как альтернатива конструкции switch было добавлено выражение match, также был добавлен новый оператор Nullsafe.
9 июля 2020 года Дэйл Хирт (англ. Шаблон:Lang-en2), менеджер проекта PHP в Microsoft, в рассылке php.internals выпустил сообщение<ref>Dale Hirt — Microsoft Support of PHP on Windows Шаблон:WaybackШаблон:Ref</ref> о том, что после выпуска версии PHP 8.0 Microsoft прекратит поддержку разработки этого языка программирования для Windows<ref>Windows 10 прекратит поддержку PHP Шаблон:WaybackШаблон:Ref</ref>. Специалисты Microsoft занимались компиляцией бинарных версий интерпретатора для ОС Windows и тестированием их безопасности. В сообществе разработчиков PHP сообщили, что примут все необходимые меры, чтобы найти в ближайшее время альтернативный вариант для организации поддержки PHP 8.0 и выше для Windows, например, своими силами<ref>Шаблон:Cite web</ref>.
В ноябре 2025 года выйдет версия 8.5.
Синтаксис

Шаблон:Родственный проект{{#if:||{{#if:||}}}}
Синтаксис PHP подобен синтаксису языка Си. Некоторые элементы, такие как ассоциативные массивы и цикл foreach, заимствованы из Perl.
Лексический анализ PHP осуществляется посредством утилиты re2c<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>, утилита генерирует быстрые и легко встраиваемые лексеры.
Для написания простейшего скрипта не требуется описывать какие-либо переменные, используемые модули и т. п. Любой скрипт может начинаться непосредственно с оператора <?php, а заканчиваться оператором ?>. Закрывающий оператор не обязателен и его рекомендуется опускать, чтобы избежать проблем с отправкой лишних символов в поток вывода после выполнения основного кода.
Простейшая программа Hello world на PHP выглядит следующим образом: <source lang="php" line="1"> <?php
echo 'Hello, world!'; </source>
Также возможен более короткий вариант вывода строки:
<source lang="php" line="1">
<?='Hello, world!'?>
</source>
Открывающий тег вида <?= используется для сокращённой записи конструкций, используемых для вывода строки.
Стоит обратить внимание, что хоть <?= и является сокращённой формой <?php echo, однако не является «сокращённым тегом» (таким как <?). Сокращённые теги были помечены устаревшими и их использование крайне не рекомендуется, в отличие от <?=, использование которого не будет вызывать проблем с совместимостью и переносимостью кода.
PHP исполняет код, находящийся внутри ограничителей, таких как <?php ?>. Всё, что находится вне ограничителей, выводится без изменений. В основном это используется для вставки PHP-кода в HTML-документ, например, так:
<source lang="html5" line="1"> <html>
<head>
<title>
Тестируем PHP
</title>
</head>
<body>
<?php echo 'Привет, мир!'; ?>
</body>
</html> </source>
До версии 7.0 допускалось использование ограничителей языка программирования ASP <% %> и <script language="php"> </script>. Работа сокращённых конструкций определяется в конфигурационном файле php.ini.
Имена переменных начинаются с символа $, тип переменной объявлять не нужно. Имена переменных и констант чувствительны к регистру символов. Имена классов, методов классов и функций к регистру символов не чувствительны. Переменные обрабатываются в строках, заключённых в двойные кавычки, и heredoc-строках (строках, созданных при помощи оператора <<<). Переменные в строках, заключённых в одинарные кавычки и nowdoc не обрабатываются.
Инструкции разделяются с помощью точки с запятой (;), за исключением некоторых случаев, после объявления конструкции if/else и циклов.
Переменные в функцию можно передавать как по значению, так и по ссылке (используется знак &).
PHP поддерживает три типа комментариев: в стиле языка Си (ограниченные /* */), C++ (начинающиеся с // и идущие до конца строки) и оболочки UNIX (с # до конца строки).
Типы данных
PHP является языком программирования с динамической типизацией, не требующим указания типа при объявлении переменных, равно как и самого объявления переменных.
К скалярным типам данных относятся:
- целочисленный тип (int)
- число с плавающей точкой (float)
- логический тип (bool)
- строковый тип (string)
К нескалярным типам относятся:
Диапазон целых чисел (int) в PHP зависит от платформы (для 32-битной архитектуры диапазон числа не превышает 32 бита, то есть, от −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 для определения типа не допускается.
Современный PHP реализует базовую поддержку алгебраических типов данных и позволяет использовать как конъюнкцию, так и дизъюнкцию при определении типа. Язык не позволяет использовать псевдонимы типов, однако предоставляет несколько встроенных реализаций, которые в рамках PHP именуются «псевдотипами». Подобный термин в языке применяется к любому определению типа, который не является самостоятельным, применимым к значению, а реализован лишь как инструкция проверки типа в Zend VM (иногда применяется устоявшийся англицизм «тайп-хинт»). <source lang="php" line="1"> // Для функции определён «псевдотип» mixed function example(): mixed {
return 42;
}
$result = example(); var_dump($result); // int(42) // Однако фактический тип у переменной $result — это int </source>
К «псевдотипам» относятся:
- mixed любой тип
- iterable (array или любой объект, реализующий интерфейс итератора).
- callable (функция, анонимная функция, статичный метод класса или любой другой объект, который имплементирует __invoke())<ref name=":0">Шаблон:Cite web</ref>
- void возвращаемый тип, означающий отсутствие возврата из функции
- never возвращаемый тип, означающий прерывание работы приложения
- self тип, требующий соответствие классу в рамках которого данный тип был определён.
- parent тип, требующий соответствие родительскому классу.
- static возвращаемый тип, требующий соответствие классу любого потомка.
- false и true типы (часть bool).
Помимо проверок на соответствие типам встроенные «псевдотипы» могут реализовывать дополнительную логику проверок. Например, callable должен соответствовать (одному из):
- анонимной функции;
- строкой, которая должна содержать имя функции;
- массивом где нулевой и первый элемент — строки (интерпретируется как название статической функции класса);
- массивом где нулевой элемент — объект, а первый — строка (интерпретируется как метод у объекта).
Функции
PHP поддерживает как объявление именованных функций, так и анонимных функций первого класса, например:<source lang="php" line="1"> // Объявление именованной функции function get_hello_world(): string {
return 'Hello World!';
}
// Объявление анонимной функции $getHelloWorld = function(): string {
return 'Hello World!';
};
// Короткий синтаксис
$getHelloWorld = fn(): string => 'Hello World!';
</source>Стоит обратить внимание, что в случае анонимных функций различие состоит не только в визуальных отличиях, но и в способе захвата переменных внешнего контекста. Любая «короткая» форма записи является замыканием, в то же время длинная запись для реализации замыкания требует явного указания переменных внутри оператора use из внешнего контекста для их захвата:<source lang="php" line="1">
$variable = 'Hello World!';
// Использование оператора use function() use ($variable): string {
return $variable;
};
// Альтернативный вариант, используя короткий синтаксис fn(): string => $variable; </source>
Обращение к переменным и функциям
Обращение к переменным осуществляется с помощью символа $, за которым следует имя переменной. Данная конструкция может быть применена также для создания динамических переменных и функций.<ref>Шаблон:Cite web</ref> Например:
<source lang="php" line="1">
$a = 'I am a'; // Запись значения в переменную $a
echo $a; // Вывод переменной $а
$b = 'a'; echo $$b; // Вывод переменной $а (дополнительный $ перед переменной $b)
echo ${'a'}; // Вывод переменной $a
function_name(); // Вызов функции function_name $c = 'function_name'; $c(); //Вызов функции function_name
$d = 'ClassName'; $obj = new ClassName(); // Создание объекта класса ClassName $obj = new $d(); // Создание объекта класса ClassName $obj->b; // Обращение к свойству b объекта $obj->c(); // Вызов метода c() объекта
$obj->$b; // Обращение к свойству "a" объекта, так как $b = 'a' $obj->$c(); // Вызов метода function_name() объекта, так как $c = 'function_name' </source>
В PHP echo и print хоть и выглядят похоже на функции, однако первое является оператором<ref>Шаблон:Cite web</ref>, а второе выражением (то есть print возвращает значение, в отличие от echo). При их использовании можно опустить скобки.
<source lang="php" line="1">
$array = [1, 2, 3];
array_walk($array, fn (int $value) => print $value); // Напечатает: 123
array_walk($array, fn (int $value) => echo $value); // Ошибка: Syntax error, unexpected token "echo" // Так как тело коротких анонимных функций допускает только выражения. </source>
Суперглобальные массивы
Суперглобальными массивами (англ. Шаблон:Lang-en2) в 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)- Текущие переменные среды (англ. Шаблон:Lang-en2). Их набор специфичен для платформы, на которой выполняется скрипт.
$_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.
$_SESSION(уст.$HTTP_SESSION_VARS)- Содержит данные сессии.
Объектно-ориентированное программирование
Ключевое слово class было зарезервировано ещё в третьей версии языка.
В четвёртой версии стало возможно создавать классы и объекты на их основе. Однако принципы ООП поддерживались лишь частично, так например, все члены (переменные и методы) были открыты. К тому же создание объектов было дорогой операцией и работало медленно.
Начиная с пятой версии PHP обладает полной поддержкой ООП. Работа с классами была оптимизирована и теперь такой код работает достаточно быстро.
Класс в PHP объявляется с помощью ключевого слова class. Методы и свойства класса могут быть общедоступными (public, по умолчанию), защищёнными (protected) и скрытыми (private). PHP поддерживает все три основных механизма ООП — инкапсуляцию, полиморфизм подтипов и наследование (родительский класс указывается с помощью ключевого слова extends после имени класса). Поддерживаются интерфейсы (ставятся в соответствие с помощью implements). Разрешается объявление финальных, абстрактных методов и классов. Множественное наследование классов не поддерживается, однако класс может реализовывать несколько интерфейсов. Для обращения к методам родительского класса используется ключевое слово parent.
Начиная с версии 5.4.0 множественное наследование может быть реализовано с помощью механизма особенностей (англ. Шаблон:Lang-en2). Особенности похожи на примеси (англ. Шаблон:Lang-en2), за исключением того что для них нельзя напрямую создать экземпляр. Повторное использование кода заключено в использовании кода особенности в нескольких классах. Допускается использовать в одном классе несколько особенностей. Механизм особенностей имеет средства разрешения конфликтов имён. При запуске программы код особенности будет «вкомпилирован» в код содержащего его класса.
Классы в PHP имеют ряд «магических» методов (англ. Шаблон:Lang-en2), начинающихся с двух символов подчёркивания — конструктор (__construct(), в версиях до 5.0 конструктором служил метод, одноимённый с классом) и деструктор (__destruct()), а также методы чтения (__get()) и записи (__set()), свёртывания (__sleep()) и развёртывания (__wakeup()), клонирования (__clone()) и др. Эти методы являются достаточно гибким инструментом: переопределяя их, можно добиться существенного изменения поведения объекта.
Все функции-члены реализованы виртуальными и потому все они являются методами.
Экземпляры класса создаются с помощью ключевого слова new, обращение к полям и методам объекта производится с использованием оператора ->. Для доступа к членам класса из его методов используется переменная $this.
<source lang="php" line="1">
class C1 extends C2 implements I1, I2
{
private int $a; protected int $b;
public function __construct(int $a, int $b)
{
parent::__construct($a, $b);
$this->a = $a;
$this->b = $b;
}
public function plus(): int
{
return $this->a + $this->b;
}
/* ............... */
}
$d = new C1(1, 2); echo $d->plus(); // 3 </source> Начиная с пятой версии PHP объекты передаются по указателю: <source lang="php" line="1"> class A {
public string $color = 'red';
}
$a = new A(); echo $a->color; // red $b = $a; $b->color = 'blue'; echo $a->color; // blue </source>
Иногда также можно встретить упоминание, что объекты передаются по ссылке, однако это не так. Так как в PHP отсутствует понятие «указателя», то может применяться терминология «передачи по ссылке» в контексте передачи объектов в качестве аргументов функций или методов из-за схожести поведения. Отличия между передачей объектов по ссылке и по указателю выглядят следующим образом: <source lang="php" line="1"> class A {}
function by_pointer(A $object): void {
$object = 42;
}
function by_reference(A &$object): void {
$object = 42;
}
$object = new A();
// Передача по указателю by_pointer($object); var_dump($object); // object(A) {}
// Передача по ссылке by_reference($object); var_dump($object); // int(42) </source>
Шаблон:Anchor «Paamayim Nekudotayim» (иврит: פעמיים נקודתיים) или просто «двойное двоеточие». Используя эту лексему, программист может обращаться к константам, статическим или перегруженным свойствам или методам класса. При обращении к этим элементам извне класса программист должен использовать имя этого класса. «Paamayim Nekudotayim» на первый взгляд может показаться странным словосочетанием для обозначения двойного двоеточия. Однако во время создания Zend Engine версии 0.5 (который входил в PHP3), Andi и Zeev выбрали<ref>По-видимому, позаимствовали из языка C++, где это бинарная форма указания области видимости, конструкция с ним, квалифицированным именем, в данном случае константы.</ref> именно это обозначение. «Paamayim Nekudotayim» действительно значит «двойное двоеточие» (дословно: «два раза двоеточие») на иврите. Это обозначение не менялось ни разу в течение всего времени разработки PHP<ref>Шаблон:Cite web</ref>. <source lang="php" line="1"> class MyClass {
public const CONST_VALUE = 'Значение константы';
} // Использование :: вне объявления класса echo MyClass::CONST_VALUE; </source>
Особенности интерпретатора
PHP-скрипты обычно обрабатываются интерпретатором в порядке, обеспечивающем кроссплатформенность разработанного приложения:
- лексический анализ исходного кода и генерация лексем,
- синтаксический анализ полученных лексем,
- генерация опкода для виртуальной машины (разновидность байт-кода),
- оптимизация (например DCE),
- выполнение опкода интерпретатором (без создания исполняемого файла), либо JIT-компиляция результата с последующим выполнением (для включения JIT требуется специальный флаг в настройках интерпретатора).
Раньше, для увеличения быстродействия приложений было возможно использование специального программного обеспечения, так называемых акселераторов. Принцип их работы заключается в кэшировании однажды сгенерированного байт-кода в памяти и/или на диске, таким образом, из процесса работы приложения исключаются этапы 1—3, что в общем случае ведёт к значительному ускорению работы. Начиная с версии 5.5 одна из разновидностей акселераторов, opcache, была встроена в ядро, поэтому сторонние решения больше не пользуются популярностью.
Важной особенностью является то, что разработчику нет необходимости заботиться о распределении и освобождении памяти. Ядро PHP реализует средства для автоматического управления памятью; вся выделенная память возвращается системе после завершения работы скрипта<ref>Шаблон:Cite web</ref>.
Расширения
Интерпретатор состоит из ядра и подключаемых модулей, «расширений», представляющих собой динамические библиотеки. Расширения позволяют дополнить базовые возможности языка, предоставляя возможности для работы с базами данных, сокетами, динамической графикой, криптографическими библиотеками, документами формата PDF и тому подобным. Любой желающий может разработать своё собственное расширение и подключить его. Существует огромное количество расширений, как стандартных, так и созданных сторонними компаниями и энтузиастами, однако в стандартную поставку входит лишь несколько десятков хорошо зарекомендовавших себя. Множество расширений доступно в репозитории PECL.
Начиная с версии 7.4.0 в PHP была добавлена поддержка интерфейса внешних функций (FFI), что в значительной степени упростило взаимодействие с библиотеками, написанными на любом другом языке (включая API, предоставляемое операционной системой). Этот новый функционал, в свою очередь, предоставил альтернативу написанию расширений. Таким образом, используя FFI можно писать код на языке PHP и взаимодействовать с любыми библиотеками в системе, которые предоставляют cdecl, fastcall или stdcall ABI.
Параметры настройки
Интерпретатор PHP имеет специальный конфигурационный файл — php.ini, содержащий множество настроек, изменение которых влияет на поведение интерпретатора<ref>Шаблон:Cite web</ref>. Имеется возможность отключить использование ряда функций, изменить ограничения на используемую скриптом оперативную память, время выполнения, объём загружаемых файлов, настроить журналирование ошибок, работу с сессиями и почтовыми сервисами, подключить дополнительные расширения, а также многое другое. Возможно дробление большого конфигурационного файла на части. Например, широко распространена практика вынесения настроек расширений в отдельные файлы. Параметры интерпретатора могут быть переопределены в файлах конфигурации HTTP-сервера (например, .htaccess в Apache) или в самом скрипте во время выполнения при помощи команды ini_set<ref>Шаблон:Cite web</ref>.
Режимы запуска интерпретатора (SAPI)
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.
- В качестве скрипта командной строки (CLI SAPI), являющегося исполняемым файлом, который вызывается пользователем из командной строки; скрипт выполняется в окружении вызвавшего пользователя. В этом случае возможно использование PHP для создания клиентских GUI-приложений<ref>Шаблон:Cite web</ref> и решения административных задач в операционных системах UNIX, Linux, Microsoft Windows, Mac OS X и AmigaOS. Однако в таком качестве он не получил распространения, отдавая пальму первенства Perl, Python и VBScript.
Начиная с версии PHP 5.4.0 в CLI SAPI появилась возможность запуска PHP как отдельного HTTP-сервера. Однако этот режим предназначен исключительно для разработки, так как запускает только один процесс интерпретатора и выполняет все запросы исключительно последовательно.
Пасхальные яйца
PHP имеет несколько пасхальных яиц (шуток). Передача специальных GET-параметров любому php-скрипту приводит к выводу различных изображений.
Например:
любой_сценарий.php?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
при вводе этого значения в адресную строку браузера можно увидеть различные изображения, в зависимости от версии интерпретатора:
- фотография Thies Arntzen (версии 4.1.2, 4.2.2)
- фотография таксы (владелец Stig Bakken) (версии 4.3.2, 4.3.3, 4.3.8 — 4.3.10)
- фотография чёрного терьера (владелец Zeev Suraski) (версии 4.3.11, 4.4.0 — 4.4.4, 5.1.0, 5.1.2)
- фотография кролика (версии 4.3.1, 5.0.0, 5.0.3)
- искажённый логотип PHP (версии 5.1.3 — 5.2.13)<ref name="0php_eeggs">Шаблон:Cite web</ref>
- фотография игрушечного синего слона с надписью PHP (начиная с версии 5.3.0)<ref name="0php_eeggs"/>
Следующие два значения позволят увидеть стандартный логотип PHP и ZEND, соответственно<ref name="0php_eeggs"/>:
любой_сценарий.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 любой_сценарий.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42
Эти значения можно получить и непосредственно в PHP-скрипте с помощью функций php_logo_guid и zend_logo_guid для логотипа Zend.
Также имеется специальное значение для отображения списка всех авторов PHP (4,5)<ref name="0php_eeggs"/>:
любой_сценарий.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
Альтернативные реализации
В силу популярности языка PHP и желания увеличить быстродействие основанных на нём веб-приложений создано несколько альтернативных компиляторов, близких к PHP-языку. Так в феврале 2010 года компания Facebook открыла<ref>HipHop for PHP: Move Fast</ref><ref>Шаблон:Cite web</ref> свой компилятор PHP — HipHop (HPHP, Hyper-PHP) генерирующий код на C++, с последующей компиляцией в машинный код с помощью gcc. В июле 2013 года российская компания ВКонтакте анонсировала похожий продукт — KPHP<ref name="хакер">Шаблон:Cite web</ref>.
В таблице представлен список существующих на сегодняшний момент альтернативных реализаций.
| Название | Версия PHP (примерно) | Лицензия | Результат компиляции |
|---|---|---|---|
| KPHP | 7.4 | GPL | C++, машинный код |
| HipHop | 5.4 | PHP License | C++, машинный код |
| Roadsend PHP | 5.3 | GPL/LGPL | C, машинный код |
| Phalanger | 5.5 | Ms SS-PL<ref>Текст лицензииШаблон:Ref</ref> (Shared source) | Microsoft IL |
| Quercus (в составе веб-сервера Resin) | 5.2 | GPL или коммерческая | JVM |
| PHC | 5.2 | BSDL | C, машинный код |
| Pipp<ref>Проект находится в экспериментальной стадии</ref> | 5.3 | Artistic License и GNU GPL | Parrot |
| JPHP<ref>Проект находится в экспериментальной стадии. Последняя версия 1.3.1 (по состоянию на июль 2020 года)</ref> | 7.1 (частично 7.2, 7.3 и 7.4)<ref>Шаблон:Cite web</ref> | Apache 2.0 | JVM |
| PHPPHP | 5.4 | MIT | PHP |
| PH7 | 5.5 | Своя (Symisc Public License) | C, машинный код |
| HippyVM | 5.6 | MIT | RPython/PyPy |
На сайте phpclasses.org доступен сравнительный анализ некоторых компиляторов<ref>Шаблон:Cite web</ref>.
Лицензирование
Экосистема
Фреймворки
Системы управления содержимым
Язык PHP является самым популярным языком для разработки систем управления содержимым (Content management system, CMS).
Средства для разработки PHP-приложений
| Название | Лицензия |
|---|---|
| Codelobster | Freeware |
| Komodo | Mozilla tri-license (MPL/LGPL/GPL)<ref>Шаблон:Cite web</ref> |
| PhpStorm | Proprietary software |
| PHP Development Tools | Eclipse Public License |
| Zend Studio | Shareware |
| Aptana Studio | GNU GPL |
| phpDesigner | Shareware |
| PHP Expert Editor | Shareware<ref>Предусмотрена бесплатная регистрация для граждан exUSSR</ref> |
| NetBeans IDE | CDDL |
| RadPHP XE | Trial |
| NuSphere | Trial |
| KDevelop<ref>Шаблон:Cite web</ref> | GNU GPL |
| Microsoft WebMatrix | Freeware |
| Notepad++ | GNU GPL |
| Sublime Text | Proprietary software |
| VS.Php for Visual Studio | Proprietary software |
| PHP Tools for Visual Studio | Trial |
| DevelNext | MPL-2.0 |
| jEdit | GNU GPL-2.0 |
Стандартные рекомендации PHP
Стандартные рекомендации PHP (англ. Шаблон:Lang-en2, сокр. Шаблон:Iw) — это спецификация PHP, которая разрабатывается, принимается и публикуется группой авторитетных PHP проектов в том числе CakePHP, Composer, Joomla, PEAR, Phalcon, phpDocumentor, TYPO3, Yii framework<ref>Шаблон:Cite web</ref>. Спецификация служит стандартизацией концепций программирования на языке PHP и основана на реальном опыте, а также на исследованиях и экспериментах<ref>Шаблон:Cite web</ref>. Цель рекомендаций состоит в том, чтобы обеспечить совместимость компонентов веб-приложений разработанных разными разработчиками.
Критика
Сторонники языка PHP в качестве основных его преимуществ называют широкую распространённость, востребованность PHP-разработчиков на рынке труда и простоту изучения. К достоинствам языка относится и его достаточно быстрая эволюция.
Отсутствие поддержки многобайтовых кодировок в ядре языка
Поддержка строк с многобайтовыми кодировками (такими как UTF-8) реализуется через отдельные расширения mbstring и iconv, на уровне ядра поддержка отсутствует, однако с версии PHP 4.2.0 есть возможность переопределять стандартные функции работы со строками, подменяя их на аналоги из mbstring.
Поддержка многобайтовых кодировок во всех строковых функциях стала доступна с версии 5.4.0 (март 2012 года).
Отсутствие поддержки многопоточности
В языке не предусмотрена возможность создания многопоточных приложений и отсутствует поддержка синхронизированного доступа к ресурсам, однако реализуема при помощи расширения PCNTL<ref>Шаблон:Cite web</ref> (от англ. Шаблон:Lang-en2), но оно не подходит для решения специфических задач.
Хотя есть возможность установить расширение pthreads для «честных» потоков, но для этого интерпретатор должен быть скомпилирован с флагом thread safety, а само расширение признано устаревшим в пользу parallel (от того же автора).
В качестве более современной альтернативы возможно использование расширения Swoole.
См. также
- Стандартная библиотека PHP
- PHP-Qt
- PHP-GTK
- Акселератор PHP
- PHP-инъекция
- PHPUnit
- Selenium
- Шаблон:Iw
- Регулярные выражения
Примечания
Литература
- Шаблон:Книга
- Шаблон:Книга
- Шаблон:Книга
- Шаблон:Книга
- Шаблон:Книга
- Шаблон:Книга
- Шаблон:Книга
- Шаблон:Книга
Ссылки
- Официальный сайт PHPШаблон:Ref
- Руководство по PHPШаблон:Ref (включая FAQ)
- Шаблон:Cite web
- PHP-fig стандарты PSR
- Презентация о стандартах PSR