WikiSort.ru - Программирование

ПОИСК ПО САЙТУ | о проекте
PHP
Семантика мультипарадигменный
Класс языка сценарный язык[1], процедурный язык программирования[d], объектно-ориентированный язык программирования, мультипарадигмальный язык программирования, императивный язык программирования[d], интерпретируемый язык программирования и транслятор
Тип исполнения интерпретатор компилирующего типа[2][3]
Появился в 1995[4]
Автор Расмус Лердорф
Разработчик Лердорф, Расмус[5], Гутманс, Энди[5], PHP Group[d], Zend Technologies[6] и Сураски, Зеев
Расширение файлов .php, .phtml, .php4, .php3, .php5, .phps или .phar
Выпуск PHP 5: 5.6.38 (13 сентября 2018), PHP 7: 7.3.0 (6 декабря 2018)
Система типов слабая динамическая
Испытал влияние Perl, C, C++, Java, Tcl[4]
Лицензия PHP License[7]
ОС кроссплатформенность
Сайт php.net

PHP (/pi:.eɪtʃ.pi:/ англ. PHP: Hypertext Preprocessor — «PHP: препроцессор гипертекста»; первоначально Personal Home Page Tools[8] — «Инструменты для создания персональных веб-страниц») — скриптовый язык[9] общего назначения, интенсивно применяемый для разработки веб-приложений. В настоящее время поддерживается подавляющим большинством хостинг-провайдеров и является одним из лидеров среди языков, применяющихся для создания динамических веб-сайтов[10].

Язык и его интерпретатор (Zend Engine) разрабатываются группой энтузиастов в рамках проекта с открытым кодом[11]. Проект распространяется под собственной лицензией, несовместимой с GNU GPL.

Область применения

В области веб-программирования, в частности серверной части, PHP — один из популярных сценарных языков (наряду с JSP, Perl и языками, используемыми в ASP.NET).

Популярность в области построения веб-сайтов определяется наличием большого набора встроенных средств и дополнительных модулей для разработки веб-приложений[12]. Основные из них:

В настоящее время PHP используется сотнями тысяч разработчиков. Согласно рейтингу корпорации TIOBE, базирующемся на данных поисковых систем, в мае 2016 года PHP находился на 6 месте среди языков программирования[10]. К крупнейшим сайтам, использующим PHP, относятся Facebook, Wikipedia и др.

Входит в LAMP — распространённый набор программного обеспечения для создания и хостинга веб-сайтов (Linux, Apache, MySQL, PHP).

Создание GUI-приложений

Скриншот редактора форм WinBinder

Хотя PHP и не слишком распространён в данной области, его можно использовать и для создания GUI-приложений.

Для создания кроссплатформенных приложений служат пакеты PHP-GTK и PHP-Qt, представляющие собой обёртки для соответствующих популярных библиотек виджетов. Также существует среда разработки кроссплатформенных приложений Devel Next[13].

Для создания графических приложений для Windows существуют свободные пакеты WinBinder (написан на Си, фактически — обёртка для WinAPI), PQBuilder (написан на PHP с использованием библиотеки PHPQt5), WinForms PHP, а также предшественник Devel Next — среда быстрой разработки Devel Studio[14].

Кроме этого существует реализация PHP для .NET/Mono — Phalanger и для JVM — JPHP, результатом компиляции PHP-кода в Phalanger может быть любое .NET-приложение, в то же время JPHP поддерживает расширение Swing, почти полностью портированное из среды Java.

История

В 1994 году датский программист Расмус Лердорф разработал на C[15] набор CGI-скриптов для учёта посетителей его онлайн-резюме, обрабатывающий шаблоны HTML-документов. Лердорф назвал набор Personal Home Page Tools (Инструменты для Личной Домашней Страницы). Вскоре функциональности перестало хватать, и Лердорф разработал новый интерпретатор шаблонов PHP/FI (англ. Personal Home Page / Forms Interpreter — «персональная домашняя страница / интерпретатор форм»)[16].

8 июня 1995 года, вышел Personal Home Page (PHP Tools) version 1.0 — первый публичный релиз.

В 1997 году после длительного бета-тестирования вышла вторая версия обработчика, написанного на C — PHP/FI 2.0. Её использовали около 1 % (приблизительно 50 тысяч) всех интернет-доменов мира[8].

Версия PHP 3.0 подверглась значительной переработке, определившей современный облик и стиль языка программирования. В 1997 году два израильских программиста, Энди Гутманс и Зеев Сураски, полностью переписали код интерпретатора. PHP 3.0 был официально выпущен в июне 1998 года.[8]

Одной из сильнейших сторон PHP 3.0 была возможность расширения ядра дополнительными модулями. Впоследствии интерфейс написания расширений привлёк к PHP множество сторонних разработчиков, работающих над своими модулями, что дало PHP возможность работать с огромным количеством баз данных, протоколов, поддерживать большое число API. Большое количество разработчиков привело к быстрому развитию языка и стремительному росту его популярности. С этой версии акроним php расшифровывается как «PHP: hypertext Preprocessor», вместо устаревшего «Personal Home Page».

К зиме 1998 года, практически сразу после официального выхода PHP 3.0, Энди Гутманс и Зеев Сураски начали переработку ядра PHP. В задачи входило увеличение производительности сложных приложений и улучшение модульности базиса кода PHP. Новый движок, названный Zend Engine, успешно справлялся с поставленными задачами и впервые был представлен в середине 1999 года. PHP 4.0, основанный на этом движке и принёсший с собой набор дополнительных функций, официально вышел в мае 2000 года. В дополнение к улучшению производительности, PHP 4.0 имел ещё несколько ключевых нововведений, таких как поддержка сессий, буферизация вывода, более безопасные способы обработки вводимой пользователем информации и несколько новых языковых конструкций.

Пятая версия PHP была выпущена разработчиками 13 июля 2004 года. Изменения включают обновление ядра Zend (Zend Engine 2), что существенно увеличило эффективность интерпретатора. Введена поддержка языка разметки XML. Полностью переработаны функции ООП, которые стали во многом схожи с моделью, используемой в Java. В частности, введён деструктор, открытые, закрытые и защищённые члены и методы, окончательные члены и методы, интерфейсы и клонирование объектов. В последующих версиях также были введены пространства имён, замыкания и целый ряд достаточно серьёзных изменений, количественно и качественно сравнимых с теми, которые появились при переходе на PHP 5.0.

Шестая версия PHP разрабатывалась[17] с октября 2006 года. Было сделано[18][19] множество нововведений, как, например, исключение из ядра регулярных выражений POSIX и «длинных» суперглобальных массивов, удаление директив safe_mode, magic_quotes_gpc и register_globals из конфигурационного файла php.ini. Одним из основных новшеств должна была стать поддержка Юникода.[20]. Однако в марте 2010 года разработка PHP6 была признана бесперспективной[21] из-за сложностей с поддержкой Юникода. Исходный код PHP6 перемещён на ветвь, а основной линией разработки стала версия 5.4.

PHP 7

В 2014 году было проведено голосование, по результатам которого следующая версия получила название PHP 7[22]. Выход новой версии планировался в середине октября 2015 года[23]. В марте 2015 года Zend представили инфографику, в которой описаны основные нововведения PHP 7[24].

3 декабря 2015 года было объявлено о выходе PHP версии 7.0.0.[25]

Новая версия основывается на экспериментальной ветви PHP, которая изначально называлась phpng (PHP Next Generation — следующее поколение), и разрабатывалась с упором на увеличение производительности и уменьшение потребления памяти[26]. В новой версии добавлена возможность указывать тип возвращаемых из функции данных[27], добавлен контроль передаваемых типов для данных[28], а также новые операторы.

Синтаксис

Синтаксис PHP подобен синтаксису языка Си. Некоторые элементы, такие как ассоциативные массивы и цикл foreach, заимствованы из Perl.

Для написания простейшего скрипта не требуется описывать какие-либо переменные, используемые модули и т. п. Любой скрипт может начинаться непосредственно с оператора PHP.

Простейшая программа Hello world на PHP выглядит следующим образом:

<?php
  echo 'Hello, world!'; 
?>

Также возможен более короткий вариант вывода строки:

<?= 'Hello, world!' ?>

Открывающий тег вида <?= используется для сокращённой записи конструкций используемых для вывода строки.

PHP исполняет код, находящийся внутри ограничителей, таких как <?php ?>. Всё, что находится вне ограничителей, выводится без изменений. В основном это используется для вставки PHP-кода в HTML-документ, например, так:

<html>
   <head>
      <title>
         Тестируем PHP
      </title>
   </head>
   <body>
      <?php
         echo "Привет мир!";
      ?>
   </body>
</html>

Помимо ограничителей <?php ?>, допускается использование сокращённого варианта <? ?>. Кроме того, до версии 7.0 допускалось использование ограничителей языка программирования ASP <% %> и <script language="php"> </script>. Работа сокращённых конструкций определяется в конфигурационном файле php.ini.

Имена переменных начинаются с символа $, тип переменной объявлять не нужно. Имена переменных и констант чувствительны к регистру символов. Имена классов, методов классов и функций к регистру символов не чувствительны. Переменные обрабатываются в строках, заключённых в двойные кавычки, и heredoc-строках (строках, созданных при помощи оператора <<<). Переменные в строках, заключённых в одинарные кавычки, не обрабатываются.

PHP рассматривает переход на новую строку как пробел, так же как HTML и другие языки со свободным форматом. Инструкции разделяются с помощью точки с запятой (;), за исключением некоторых случаев, после объявления конструкции if/else и циклов.

Переменные в функцию можно передавать как по значению, так и по ссылке (используется знак &).

PHP поддерживает три типа комментариев: в стиле языка Си (ограниченные /* */), C++ (начинающиеся с // и идущие до конца строки) и оболочки UNIX# до конца строки).

Типы данных

PHP является языком программирования с динамической типизацией, не требующим указания типа при объявлении переменных, равно как и самого объявления переменных. Преобразования между скалярными типами зачастую осуществляются неявно без дополнительных усилий (впрочем, PHP предоставляет широкие возможности и для явного преобразования типов).

К скалярным типам данных относятся:

К нескалярным типам относятся:

  • массив (array)
  • объект (object)
  • внешний ресурс (resource)
  • неопределенное значение (null)

К псевдотипам[29] относятся:

Диапазон целых чисел (integer) в PHP зависит от платформы (обычно, это диапазон 32-битных знаковых целых чисел, то есть, от −2 147 483 648 до 2 147 483 647). Числа можно задавать в десятичной, восьмеричной и шестнадцатеричной системах счисления. Диапазон вещественных чисел (double) также зависит от платформы (для 32-битной архитектуры диапазон позволяет оперировать числами от ±1.7×10−308 до ±1.7×10+308).

PHP предоставляет разработчикам логический тип (boolean), способный принимать только два значения TRUE («истина») и FALSE («ложь»). При преобразовании в логический тип число 0, пустая строка, ноль в строке «0», NULL и пустой массив считаются равными FALSE. Все остальные значения автоматически преобразуются в TRUE.

Специальный тип null предназначен для переменных без определённого значения. Единственным значением данного типа является константа NULL. Тип null принимают неинициализированные переменные, переменные инициализированные константой NULL, а также переменные, удалённые при помощи конструкции unset().

Ссылки на внешние ресурсы имеют тип «ресурс» (resource). Переменные данного типа, как правило, представляют собой дескриптор, позволяющий управлять внешними объектами, такими как файлы, динамические изображения, результирующие таблицы базы данных и т. п.

Массивы (array) поддерживают числовые и строковые ключи и являются гетерогенными. Массивы могут содержать значения любых типов, включая другие массивы. Порядок элементов и их ключей сохраняется. Не совсем корректно называть php-массивы массивами, на самом деле это, скорее всего, упорядоченный хеш. Возможно неожиданное поведение при использовании цикла for со счетчиком вместо foreach. Так, например, при сортировке массива с численными индексами функциями из стандартной библиотеки, сортируются и ключи тоже.

Указатель на функцию в PHP может быть представлен замыканием или псевдотипом callback. Замыкание доступно с версии 5.3 и в коде выглядит как простое определение функции, в которую можно явно пробросить значения из контекста, например:

 function($args, $argsN) use ($ctxVar, $ctxVar1) { ... }

callback тип может быть представлен:

  • строкой (интерпретируется как название функции);
  • массивом где нулевой и первый элемент — строки (интерпретируется как название статической функции класса);
  • массивом где нулевой элемент — объект, а первый — строка (интерпретируется как метод у объекта).

Для проверки является ли значение вызываемым следует использовать is_callable($var)[30]

Обращение к переменным и функциям

Обращение к переменным осуществляется с помощью символа $, за которым следует имя переменной. Данная конструкция может быть применена также для создания динамических переменных и функций.[31] Например:

$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 = 'Class_name';
$obj = new Class_name; // Создание объекта класса Class_name
$obj = new $d(); // Создание объекта класса Class_name
$obj->b; // Обращение к свойству b объекта
$obj->c(); // Вызов метода c() объекта

$obj->$b; // Обращение к свойству a объекта, так как $b = 'a'
$obj->$c(); // Вызов метода function_name() объекта, так как $c = 'function_name'

В PHP echo и print не являются функциями[32] (хотя print имеет возвращаемое значение), а являются синтаксическими единицами. При их использовании можно опустить скобки.

Суперглобальные массивы

Суперглобальными массивами (англ. Superglobal arrays) в PHP называются предопределённые массивы, имеющие глобальную область видимости без использования директивы global. Большая часть этих массивов содержит входные данные запроса пользователя (параметры GET-запроса, поля форм при посылке методом POST, куки и т. п.).

Все суперглобальные массивы, кроме $GLOBALS и $_REQUEST, имеют устаревшие аналоги с длинными именами, которые доступны вплоть до версии 5.3. х (начиная с 5.4.0 были удалены). Таким образом, обращения $_GET['year'] и $HTTP_GET_VARS['year'] идентичны (за исключением области видимости: массивы с «длинными» именами не являются суперглобальными).

$GLOBALS
Массив всех глобальных переменных (в том числе и пользовательских).
$_SERVER (аналог для устаревшего — $HTTP_SERVER_VARS)
Содержит переменные окружения, которые операционная система передаёт серверу.
$_ENV (уст. $HTTP_ENV_VARS)
Текущие переменные среды (англ. Environment variables). Их набор специфичен для платформы, на которой выполняется скрипт.
$_GET (уст. $HTTP_GET_VARS)
Содержит параметры GET-запроса, переданные в URI после знака вопроса «?».
$_POST (уст. $HTTP_POST_VARS)
Ассоциативный массив значений полей HTML-формы при отправке методом POST. Индексы элементов соответствуют значению свойства name объектов(кнопки, формы, радио-кнопки, флажки и т. д.) HTML-формы.
$_FILES (уст. $HTTP_POST_FILES)
Ассоциативный массив со сведениями об отправленных методом POST файлах. Каждый элемент имеет индекс, идентичный значению атрибута «name» в форме, и, в свою очередь, также является массивом со следующими элементами:
  • ['name'] — исходное имя файла на компьютере пользователя.
  • ['type'] — указанный агентом пользователя MIME-тип файла. PHP не проверяет его, и поэтому нет никаких гарантий, что указанный тип соответствует действительности.
  • ['size'] — размер файла в байтах.
  • ['tmp_name'] — полный путь к файлу во временной папке. Файл необходимо переместить оттуда функцией move_uploaded_file. Загруженные файлы из временной папки PHP удаляет самостоятельно.
  • ['error'] — код ошибки. Если файл удачно загрузился, то этот элемент будет равен 0 (UPLOAD_ERR_OK).
$_COOKIE (уст. $HTTP_COOKIE_VARS)
Ассоциативный массив с переданными агентом пользователя значениями куки.
$_REQUEST
Содержит элементы из массивов $_GET, $_POST, $_COOKIE. С версии PHP 4.1 включает $_FILES.
$_SESSION (уст. $HTTP_SESSION_VARS)
Содержит данные сессии.

Объектно-ориентированное программирование

Ключевое слово class было зарезервировано ещё в третьей версии языка. В четвёртой версии стало возможно создавать классы и объекты на их основе. Однако принципы ООП поддерживались лишь частично, так например, все члены (переменные и методы) были открыты. К тому же создание объектов было дорогой операцией и работали они медленно.

Начиная с пятой версии PHP обладает полной поддержкой ООП. Работа с классами была оптимизирована и теперь такой код работает достаточно быстро.

Класс в PHP объявляется с помощью ключевого слова class. Методы и свойства класса могут быть общедоступными (public, по умолчанию), защищёнными (protected) и скрытыми (private). PHP поддерживает все три основных механизма ООП — инкапсуляцию, полиморфизм подтипов и наследование (родительский класс указывается с помощью ключевого слова extends после имени класса). Поддерживаются интерфейсы (ставятся в соответствие с помощью implements). Разрешается объявление финальных, абстрактных методов и классов. Множественное наследование классов не поддерживается, однако класс может реализовывать несколько интерфейсов. Для обращения к методам родительского класса используется ключевое слово parent.

Начиная с версии 5.4.0 множественное наследование может быть реализовано с помощью механизма особенностей (англ. trait). Особенности похожи на примеси (англ. mixins), за исключением того что для них нельзя напрямую создать экземпляр. Повторное использование кода заключено в использовании кода особенности в нескольких классах. Допускается использовать в одном классе несколько особенностей. Механизм особенностей имеет средства разрешения конфликтов имён. При запуске программы код особенности будет «вкомпилирован» в код содержащего его класса.

Классы в PHP имеют ряд «магических» методов (англ. magic methods), начинающихся с двух символов подчёркивания. Особо стоит отметить конструктор (__construct(), в версиях до 5.0 конструктором служил метод, одноимённый с классом) и деструктор (__destruct()), а также методы чтения (__get()) и записи (__set()), свёртывания (__sleep()) и развёртывания (__wakeup()), клонирования (__clone()) и др. Эти методы являются достаточно гибким инструментом: переопределяя их, можно добиться существенного изменения поведения объекта.

Все функции-члены реализованы виртуальными и потому все они являются методами.

Экземпляры класса создаются с помощью ключевого слова new, обращение к свойствам и методам объекта производится с использованием оператора ->. Для доступа к членам класса из его методов используется переменная $this.

class C1 extends C2 implements I1, I2
{
  private $a;
  protected $b;

  function __construct($a, $b)
  {
    parent::__construct($a, $b);
    $this->a = $a;
    $this->b = $b;
  }

  public function plus()
  {
    return $this->a + $this->b;
  }
/* ............... */
}

$d = new C1(1, 2);
echo $d->plus(); // 3

Начиная с пятой версии PHP, объекты передаются по ссылке:

class a 
{
  public $color = 'red';
}

$a = new a();
echo $a -> color; // red
$b = $a;
$b -> color = 'blue';
echo $a -> color; // blue

«Paamayim Nekudotayim» (иврит: פעמיים נקודתיים) или просто «двойное двоеточие». Используя эту лексему, программист может обращаться к константам, статическим или перегруженным свойствам или методам класса. При обращении к этим элементам извне класса программист должен использовать имя этого класса. «Paamayim Nekudotayim» на первый взгляд может показаться странным словосочетанием для обозначения двойного двоеточия. Однако во время создания Zend Engine версии 0.5 (который входил в PHP3), Andi и Zeev выбрали[33] именно это обозначение. «Paamayim Nekudotayim» действительно значит «двойное двоеточие» (дословно: «два раза двоеточие») на иврите. Это обозначение не менялось ни разу в течение всего времени разработки PHP[34].

<?php
class MyClass {
  const CONST_VALUE = 'Значение константы';
}
// Использование :: вне объявления класса
echo MyClass::CONST_VALUE;
?>

Фреймворки и системы управления содержимым

Самые современные и наиболее популярные:

Особенности интерпретатора

PHP-скрипты обычно обрабатываются интерпретатором в порядке[2], обеспечивающем кроссплатформенность разработанного приложения:

  1. лексический анализ исходного кода и генерация лексем,
  2. синтаксический анализ полученных лексем,
  3. генерация байт-кода,
  4. выполнение байт-кода интерпретатором (без создания исполняемого файла).

Для увеличения быстродействия приложений возможно использование специального программного обеспечения, так называемых акселераторов. Принцип их работы заключается в кэшировании однажды сгенерированного байт-кода в памяти и/или на диске, таким образом, из процесса работы приложения исключаются этапы 1—3, что в общем случае ведёт к значительному ускорению работы.

Важной особенностью является то, что разработчику нет необходимости заботиться о распределении и освобождении памяти. Ядро PHP реализует средства для автоматического управления памятью; вся выделенная память возвращается системе после завершения работы скрипта[35].

Расширения

Интерпретатор состоит из ядра и подключаемых модулей, «расширений», представляющих собой динамические библиотеки. Расширения позволяют дополнить базовые возможности языка, предоставляя возможности для работы с базами данных, сокетами, динамической графикой, криптографическими библиотеками, документами формата PDF и тому подобным. Любой желающий может разработать своё собственное расширение и подключить его. Существует огромное количество расширений, как стандартных, так и созданных сторонними компаниями и энтузиастами, однако в стандартную поставку входит лишь несколько десятков хорошо зарекомендовавших себя. Множество расширений доступно в репозитории PECL.

Параметры настройки

Интерпретатор PHP имеет специальный конфигурационный файл — php.ini, содержащий множество настроек, изменение которых влияет на поведение интерпретатора[36]. Имеется возможность отключить использование ряда функций, изменить ограничения на используемую скриптом оперативную память, время выполнения, объём загружаемых файлов, настроить журналирование ошибок, работу с сессиями и почтовыми сервисами, подключить дополнительные расширения, а также многое другое. Возможно дробление большого конфигурационного файла на части. Например, широко распространена практика вынесения настроек расширений в отдельные файлы. Параметры интерпретатора могут быть переопределены в файлах конфигурации HTTP-сервера (например, .htaccess в Apache) или в самом скрипте во время выполнения при помощи команды ini_set[37].

Режимы запуска интерпретатора (SAPI)

SAPI — это внешний уровень абстракции, предназначенный для встраивания интерпретатора в другие приложения и отвечает за его работу (запуск, остановка, передача скриптов на исполнение, доступ к внешним данным). Существует несколько основных SAPI определяющих способы запуска и использования PHP:

  1. В качестве модуля к веб-серверу (например, для Apache модуль mod_php). В этом случае интерпретатор PHP выполняется в окружении процесса веб-сервера. Веб-сервер управляет количеством запущенных процессов PHP и сообщает им какие скрипты требуется исполнить.
  2. CGI SAPI. Использование CGI подразумевает запуск нового процесса для обработки каждого запроса. Для исполнения PHP скрипта веб-сервер запускает ./php-cgi /path/to/script.php. Сам принцип такого использования подразумевает, что интерпретатор PHP исполняет только один скрипт, после чего заканчивает свою работу. Затраты на запуск процесса интерпретатора и его инициализацию очень часто сопоставимы или даже превышают затраты на исполнение PHP скрипта. Для решения этой проблемы в CGI SAPI был введён режим FastCGI. В этом режиме PHP интерпретатор запускается как независимый сервер, обрабатывающий входящие запросы на исполнение PHP скриптов по протоколу FastCGI, что позволяет ему работать с любым веб-сервером поддерживающим этот протокол.
  3. FPM SAPI, известный как php-fpm — это другая реализация протокола FastCGI. Создан изначально Андреем Нигматулиным как отдельный патч для использования в социальной сети Badoo. Данная реализация решала ряд проблем, которые мешали использованию CGI/FastCGI SAPI. В частности, появилась возможность перезапуска пула интерпретаторов PHP без потери запросов, запуск нескольких пулов под разными пользователями, аварийный перезапуск интерпретаторов в случае проблем с ними и ещё несколько приятных дополнений. В дальнейшем над патчем работали несколько человек, был добавлен режим динамического управления числом запущенных процессов PHP (по принципу управления числом процессов в веб-сервере Apache), и начиная с версии PHP 5.3.3 php-fpm был включён в PHP как отдельное SAPI.
  4. В качестве скрипта командной строки (CLI SAPI), являющегося исполняемым файлом, который вызывается пользователем из командной строки; скрипт выполняется в окружении вызвавшего пользователя. В этом случае возможно использование PHP для создания клиентских GUI-приложений[38] и решения административных задач в операционных системах 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

введя это значение в адресную строку браузера можно увидеть различные изображения, в зависимости от версии интерпретатора:

  1. фотография Thies Arntzen (версии 4.1.2, 4.2.2)
  2. фотография таксы (владелец Stig Bakken) (версии 4.3.2, 4.3.3, 4.3.8 — 4.3.10)
  3. фотография чёрного терьера (владелец Zeev Suraski) (версии 4.3.11, 4.4.0 — 4.4.4, 5.1.0, 5.1.2)
  4. фотография кролика (версии 4.3.1, 5.0.0, 5.0.3)
  5. искажённый логотип PHP (версии 5.1.3 — 5.2.13)[39]
  6. фотография игрушечного синего слона с надписью PHP (начиная с версии 5.3.0)[39]

Следующие два значения позволят увидеть стандартный логотип PHP и ZEND, соответственно[39]:

любой_сценарий.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42
любой_сценарий.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42

Эти значения можно получить и непосредственно в PHP-скрипте с помощью функций php_logo_guid и zend_logo_guid для логотипа Zend.

Также имеется специальное значение для отображения списка всех авторов PHP (4,5)[39]:

любой_сценарий.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000

Альтернативные реализации

В силу популярности языка PHP и желания увеличить быстродействие основанных на нём веб-приложений создано несколько альтернативных компиляторов, близких к PHP-языку. Так в феврале 2010 года компания Facebook открыла[40][41] свой компилятор PHP — HipHop (HPHP, Hyper-PHP) генерирующий код на C++, с последующей компиляцией в машинный код с помощью gcc. В июле 2013 года российская компания ВКонтакте анонсировала похожий продукт — KPHP[42].

В таблице представлен список существующих на сегодняшний момент альтернативных реализаций.

Название Версия PHP (примерно) Лицензия Результат компиляции
HipHop 5.4 PHP License C++, машинный код
Roadsend PHP 5.3 GPL/LGPL C, машинный код
Phalanger 5.5 Ms SS-PL[43] (Shared source) Microsoft IL
Quercus (в составе веб-сервера Resin) 5.2 GPL или коммерческая JVM
PHC 5.2 BSDL C, машинный код
Pipp[44] 5.3 Artistic License и GNU GPL Parrot
JPHP[45] 5.6 (частично 7.0 и 7.1)[46] Apache 2.0 JVM
PHPPHP 5.4 MIT PHP
PH7 5.5 Своя (Symisc Public License) C, машинный код
HippyVM 5.6 MIT RPython/PyPy

На сайте phpclasses.org доступен сравнительный анализ некоторых компиляторов: PHP compiler performance.

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

Приложения PHP

Библиотека PEAR

Популярные веб-приложения

С использованием PHP разработано множество приложений, которые широко используются на различных сайтах, форумах и блогах.

Вспомогательные каркасы

Для быстрой разработки приложений на PHP было создано множество фреймворков, наиболее популярными из которых являются Zend Framework, CakePHP, Symfony, Laravel, CodeIgniter, Kohana, Phalcon и Yii[47]. Основные преимущества такой разработки — это предоставление возможности строить проект при помощи паттерна MVC.

Интегрированные среды разработки для PHP

Название Лицензия Сайт
Codelobster Freeware http://www.codelobster.com
Komodo Mozilla tri-license (MPL/LGPL/GPL)[48] http://www.activestate.com
JetBrains PhpStorm Proprietary software http://www.jetbrains.com/phpstorm/
PHP Development Tools Eclipse Public License http://www.eclipse.org/pdt/
Zend Studio Shareware http://www.zend.com/products/zend_studio/
Aptana Studio GNU GPL https://web.archive.org/web/20141028160346/http://aptana.org/
phpDesigner Shareware http://www.mpsoftware.eu/
PHP Expert Editor Shareware[49] http://www.phpexperteditor.com/
NetBeans IDE CDDL http://www.netbeans.org/
RadPHP XE Trial https://web.archive.org/web/20101225190602/http://www.embarcadero.com/products/radphp
NuSphere Trial http://www.nusphere.com/
KDevelop[50] GNU GPL http://www.kdevelop.org/
Microsoft WebMatrix Freeware http://www.microsoft.com/web/webmatrix/
Notepad++ GNU GPL http://notepad-plus-plus.org/
Sublime Text 2 Proprietary software http://www.sublimetext.com/
VS.Php for Visual Studio Proprietary software http://www.jcxsoftware.com/jcx/vsphp/home
PHP Tools for Visual Studio Trial http://www.devsense.com
DevelNext MPL-2.0 http://develnext.org/
jEdit GNU GPL-2.0 http://jedit.org/

Критика

Сторонники языка PHP в качестве основных его преимуществ называют широкую распространённость, востребованность PHP-разработчиков на рынке труда и простоту изучения. К достоинствам языка относится и его достаточно быстрая эволюция. В то же время язык часто критикуют за несогласованный синтаксис функций и неортогональность дизайна. Такие претензии суммированы в известной блогозаписи «PHP: фрактал плохого дизайна»[51][52], опубликованной в 2012 году. Её автор пишет, что «Фактически каждая деталь PHP в какой-то мере поломана. Язык, структура, экосистема: всё плохо». Среди недостатков языка он называет запутанную систему типов данных, основанную на слабой типизации а в качестве причин всеобщей несогласованности называет отсутствие чёткой философии, при разработке языка. Ранние версии PHP ориентировались на Perl, стандартная библиотека — на язык C, а реализация объектно-ориентированной парадигмы — на C++ и Java. Эту критику признают отчасти справедливой (хотя и гипертрофированной) и некоторые участники сообщества PHP-разработчиков[53].

Отсутствие обратной совместимости между версиями языка

В связи с развитием PHP и избавлением его от устаревшего наследия[en] ранних версий языка, код, созданный для более ранних версий языка, зачастую не работает или работает некорректно с более поздними версиями языка[54]. В более поздних версиях исключаются конструкции, методики, функции, применявшиеся ранее. В результате, приложения, созданные несколько лет назад, практически теряют работоспособность для современных версий языка и требуют значительной модификации. Такие изменения обусловлены двумя факторами: устранением несогласованного синтаксиса и устранением конструкций, поощряющих создание небезопасного кода.

В версиях линейки 5.3.x большое количество функций было признано устаревшими, их поддержка не планируется в новых версиях языка[55], что вызывает несовместимость со скриптами, которые используют устаревшие функции.

Надо отметить, что противоречие между обратной совместимостью и процессом развития — одна из ключевых проблем в разработке программного и аппаратного обеспечения. При работе над скриптовыми языками время от времени происходит резкая смена его архитектуры (а порой и парадигмы), обычно сопровождающаяся сменой первой цифры в номере версии. Так, в настоящее время идёт постепенный переход на новую ветвь языка Python — 3.x, в стадии тестирования находится Perl 6, являющийся, по сути, новым perl-подобным языком. При этом принято выпускать переходные версии, в которых постепенно вводятся новые конструкции, а использование устаревших вызывает вывод предупреждений. К таким переходным версиям относится и PHP 5.3.

7 марта 2013 года Zend Technologies объявили, что в версию PHP 5.5, когда она будет выпущена, решено интегрировать Zend Optimizer+, который включает в себя кэш опкодов и оптимизатор кода.

Отсутствие поддержки многобайтовых кодировок в ядре языка

Поддержка строк с многобайтовыми кодировками, такими, как UTF-8, реализуется через отдельные расширения mbstring и iconv, на уровне ядра поддержка отсутствует, однако с версии PHP 4.2.0 есть возможность переопределять стандартные функции работы со строками, подменяя их на аналоги из mbstring. Поддержка многобайтовых кодировок во всех строковых функциях стала доступна с версии 5.4.0 (март 2012 года).

Отсутствие поддержки многопоточности

В языке не предусмотрена возможность создания многопоточных приложений и отсутствует поддержка синхронизированного доступа к ресурсам, однако реализуема при помощи расширения PCNTL[56]. Однако следует отметить, что использование PCNTL или ProcessControl не подходит для решения специфических задач.

Хотя есть возможность установить расширение pthreads для «честных» потоков, но для этого интерпретатор должен быть скомпилирован с флагом thread safety.

См. также

Примечания

  1. http://php.net/
  2. 1 2 PHP Compiler Internals (англ.). Проверено 17 ноября 2009. Архивировано 21 августа 2011 года.
  3. PHP: Zend API: Hacking the Core of PHP — Manual
  4. 1 2 Rasmus Lerdorf began assembling C code originally written for CGI scripts into a library and accessing the library's functions, including SQL queries, through HTML-embedded commands in 1994; Lerdorf, Rasmus PHP on Hormones – history of PHP presentation by Rasmus Lerdorf given at the MySQL Conference in Santa Clara, California (mp3). The Conversations Network (26 апреля 2007). — «Every day I would change the language drastically, and it didn't take very long, so by 1995, mid-1995 or so, PHP looked like this. This isn't that far from what PHP looks like today, actually.». Проверено 11 декабря 2009. Архивировано 25 февраля 2013 года.
  5. 1 2 http://php.net/manual/en/history.php.php
  6. https://www.technotification.com/2018/04/best-php-frameworks.html
  7. http://php.net/license/
  8. 1 2 3 PHP: History of PHP — Manual
  9. PHP: Preface — Manual (англ.). Архивировано 21 августа 2011 года.
  10. 1 2 TIOBE Software: Tiobe Index
  11. History of PHP and related projects (англ.). Архивировано 21 августа 2011 года.
  12. PHP: Отличительные особенности — Manual (21 июня 2009). Проверено 13 ноября 2009. Архивировано 21 августа 2011 года.
  13. Devel Next
  14. Devel Studio
  15. Rasmus Lerdorf. I wonder why people keep writing that PHP was ever written in Perl. It never was. #php (англ.). @rasmus (20 July 2012). Проверено 8 января 2019.
  16. Савельева Н. Лекция 1: Введение в PHP / Язык программирования PHP. Интуит, 2005. ISBN 978-5-9556-0026-0
  17. Количество переписанных функций с поддержкой Юникода
  18. Файл news.txt из дистрибутива PHP 6
  19. Текущий список выполненных и невыполненных работ по PHP 6
  20. Полный список изменений, которые были запланированы в декабре 2005 года
  21. Как умер PHP6
  22. PHP RFC: Name of Next Release of PHP
  23. PHP RFC: PHP 7.0 timeline
  24. PHP 7 Coolest Features: Space Ships, Type Hints, 2X Speed (англ.). www.zend.com. Проверено 6 июля 2017.
  25. PHP: News Archive — 2015
  26. PHP: rfc:phpng. php.net. Проверено 16 декабря 2014.
  27. RFC: Return Types. php.net.
  28. RFC: Scalar Type Declarations. php.net.
  29. PHP: Pseudo-types and variables used in this documentation — Manual
  30. 1 2 PHP: Функции обратного вызова (callback-функции) - Manual. secure.php.net. Проверено 27 февраля 2019.
  31. PHP: Variable variables — Manual
  32. PHP: echo — Manual
  33. По-видимому, позаимствовали из языка C++, где это бинарная форма указания области видимости, конструкция с ним, квалифицированным именем, в данном случае константы.
  34. http://php.net/manual/en
  35. PHP: Basic memory management — Manual (13 ноября 2009). Проверено 17 ноября 2009. Архивировано 21 августа 2011 года.
  36. PHP: php.ini directives — Manual (англ.) (6 ноября 2009). Проверено 13 ноября 2009. Архивировано 21 августа 2011 года.
  37. PHP: List of php.ini directives — Manual (англ.) (6 ноября 2009). Проверено 13 ноября 2009. Архивировано 21 августа 2011 года.
  38. PHP: Использование PHP в командной строке — Manual (21 июня 2009). Проверено 13 ноября 2009. Архивировано 21 августа 2011 года.
  39. 1 2 3 4 PHP Easter Egg (англ.). Проверено 16 ноября 2009. Архивировано 21 августа 2011 года.
  40. HipHop for PHP: Move Fast
  41. Компания Facebook открыла код высокопроизводительного PHP транслятора
  42. Павел Дуров с коллегами разработали улучшенную версию PHP
  43. Текст лицензии (англ.)
  44. Проект находится в экспериментальной стадии
  45. Проект находится в экспериментальной стадии. Последняя версия 0.9.3 (по состоянию на апрель 2018 года)
  46. jphp-group/jphp (англ.). GitHub. Проверено 18 ноября 2018.
  47. Merkel, Dirk. Chapter 6: PHP Frameworks // Expert PHP 5 Tools. — Packt Publishing, 2010. ISBN 978-1-847198-38-9.
  48. Komodo IDE is a Professional Development Environment for Perl, Python, Tcl | ActiveState
  49. Предусмотрена бесплатная регистрация для граждан exUSSR
  50. PHP support for KDevelop 4 (and eventually Quanta+) | Milian Wolff
  51. Eevee. PHP: a fractal of bad design (англ.). fuzzy notepad. eev.ee (9 April 2012). Проверено 16 января 2019.
  52. PHP: фрактал плохого дизайна. habr.com (16 апреля 2012). Проверено 16 января 2019.
  53. Paul Krill. Why developers love and hate PHP. The language has a substantial stake in Web development, but it is marred by design flaws (англ.). InfoWorld[en] (12 2014).
  54. PHP: Backward Incompatible Changes — Manual
  55. PHP: Deprecated features in PHP 5.3.x. php.net Team. Архивировано 21 августа 2011 года.
  56. PCNTL

Литература

  • Дмитрий Котеров, Алексей Костарев. PHP. СПб.: «БХВ-Петербург», 2005. — С. 1120. — (В подлиннике). ISBN 5-94157-245-X.
  • Костарев А. Ф. PHP 5. СПб.: «БХВ-Петербург», 2008. — С. 1104. ISBN 978-5-9775-0315-0.
  • Мэтт Зандстра. PHP: объекты, шаблоны и методики программирования = PHP Objects, Patterns and Practice, Third Edition. — 3-е издание. М.: «Вильямс», 2010. — С. 560. ISBN 978-5-8459-1689-1.
  • Кристиан Дари, Эмилиан Баланеску. PHP и MySQL: создание интернет-магазина = Beginning PHP and MySQL E-Commerce: From Novice to Professional. М.: «Вильямс», 2010. ISBN 978-5-8459-1602-0.
  • Джейсон Ленгсторф. PHP и jQuery для профессионалов = Pro PHP and jQuery. М.: «Вильямс», 2010. — С. 352. ISBN 978-5-8459-1693-8.
  • Стив Суэринг, Тим Конверс, Джойс Парк. PHP и MySQL = PHP 6 and MySQL 6 Bible. — 2-е издание. М.: «Диалектика», 2010. — С. 912. — (Библия программиста). ISBN 978-5-8459-1640-2.
  • Квентин Зервас. Web 2.0: создание приложений на PHP = Practical Web 2.0 Applications with PHP. М.: «Вильямс», 2009. — С. 544. ISBN 978-5-8459-1590-0.

Ссылки

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии