PHP

Материал из Википедии — свободной энциклопедии

Перейти к: навигация, поиск
PHP
Семантика: мультипарадигменный
Класс языка: {{{paradigm}}}
Тип исполнения: Интерпретатор компилирующего типа
Появился в: 1994 г.
Автор(ы): Расмус Лердорф
Последняя версия: {{{latest_release_version}}}
Тестовая версия: {{{latest_test_version}}}
Типизация данных: динамическая
Основные реализации: {{{implementations}}}
Диалекты: отсутствуют
Создан под влиянием: Perl, C, Java
Оказал влияние на: нет или не известно

PHP (англ. PHP: Hypertext Preprocessor — «PHP: препроцессор гипертекста») — язык программирования, созданный для генерации HTML-страниц на веб-сервере и работы с базами данных. В настоящее время поддерживается подавляющим большинством хостинг-провайдеров. Входит в LAMP — «стандартный» набор для создания веб-сайтов (Linux, Apache, MySQL, PHP (Python или Perl)).

Группа разработчиков PHP состоит из множества людей, добровольно работающих над ядром и расширениями PHP и смежными проектами, такими как PEAR или документация языка.[1]

Содержание

[править] Использование PHP

В области программирования для Сети, PHP — один из популярнейших скриптовых языков (наряду с JSP, Perl и языками, используемыми в ASP.NET) благодаря своей простоте, скорости выполнения, богатой функциональности и распространению исходных кодов на основе лицензии PHP. PHP отличается наличием ядра и подключаемых модулей, «расширений»: для работы с базами данных, сокетами, динамической графикой, криптографическими библиотеками, документами формата PDF и т. п. Любой желающий может разработать своё собственное расширение и подключить его. Существуют сотни расширений, однако в стандартную поставку входит лишь несколько десятков хорошо зарекомендовавших себя. Интерпретатор PHP подключается к веб-серверу либо через модуль, созданный специально для этого сервера (например, для Apache или IIS), либо в качестве CGI-приложения.

Кроме этого, он может использоваться для решения административных задач в операционных системах UNIX, GNU/Linux, Microsoft Windows, Mac OS X и AmigaOS. Однако в таком качестве он не получил распространение, отдавая пальму первенства Perl, Python и VBScript.

В настоящее время PHP используется сотнями тысяч разработчиков. Порядка 20 миллионов сайтов сообщают о работе с PHP, что составляет более пятой доли доменов Интернета[2].

[править] История

Название PHP — рекурсивная аббревиатура, означающая «PHP: Hypertext Preprocessor» (ранее акроним расшифровывался как «Personal Home Page Tools»). Изначально PHP создавался в качестве надстройки над Perl для облегчения разработки веб-страниц.

[править] PHP/FI

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

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

[править] PHP 3

PHP 3.0 была первой версией, напоминающей PHP, каким мы знаем его сегодня. В 1997 году два израильских программиста Энди Гутманс (Andi Gutmans) и Зив Сураски (Zeev Suraski), разработчики из израильского института технологий (Technion), переписали код с нуля: разработчики сочли PHP/FI 2.0 непригодным для разработки приложения электронной коммерции, над которым они работали для проекта Университета расположенного в Хайфе, Израиль. Для совместной работы над PHP 3.0 с помощью базы разработчиков PHP/FI 2.0 Энди, Расмус и Зив решили объединиться и объявить PHP 3.0 официальным преемником PHP/FI, разработка же PHP/FI была практически полностью прекращена.

Одной из сильнейших сторон PHP 3.0 была возможность расширения ядра. Впоследствии интерфейс написания расширений привлёк к PHP множество сторонних разработчиков, работающих над своими модулями, что дало PHP возможность работать с огромным количеством баз данных, протоколов, поддерживать большое число API. Фактически, это и был главный ключ к успеху, но стоит добавить, что немаловажным шагом оказалась разработка нового, намного более мощного и полного синтаксиса с поддержкой ООП.

Абсолютно новый язык программирования получил новое имя. Разработчики отказались от дополнения о персональном использовании, которое имелось в аббревиатуре PHP/FI. Язык был назван просто PHP — аббревиатура, содержащая рекурсивный акроним (англ. PHP: Hypertext Preprocessor — «PHP: Препроцессор Гипертекста»).

К концу 1998 года PHP использовался десятками тысяч пользователей. Сотни тысяч веб-сайтов сообщали о том, что они работают с использованием этого языка. В то время PHP 3.0 был установлен приблизительно на 10 % веб-серверов Интернета.

PHP 3.0 был официально выпущен в июне 1998 года после 9 месяцев публичного тестирования.

[править] PHP 4

К зиме 1998 года, практически сразу после официального выхода PHP 3.0, Энди Гутманс и Зив Сураски начали переработку ядра PHP. В задачи входило увеличение производительности сложных приложений и улучшение модульности базиса кода PHP. Расширения дали PHP 3.0 возможность успешно работать с набором баз данных и поддерживать большое количество различных API и протоколов, но PHP 3.0 не имел качественной поддержки модулей и приложения работали неэффективно.

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

Обновления PHP 4 выпускались только до конца 2007 года[3]. До этого же времени осуществлялась официальная поддержка четвертой версии. Далее до 8 августа 2008 года по мере необходимости будут появляться только критические обновления безопасности. С 9 августа четвертая версия PHP уйдет в историю.

[править] PHP 5

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

[править] PHP 6

Шестая версия PHP находится в стадии[5] разработки с октября 2006 года. В ней уже сделано[6][7] множество нововведений, как, например, исключение из ядра регулярных выражений POSIX и «длинных» суперглобальных массивов, удаление директив safe_mode, php_magic_quotes и register_globals из конфигурационного файла php.ini. Также много внимания уделено поддержке Юникода.[8]. Загрузить текущую версию разрабатываемого кода для GNU/Linux/BSD и скомпилированные версии для Microsoft Windows можно на сайте PHP Snapshots.

[править] Синтаксис

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

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

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

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

<html>
 <head>
  <title>Тестируем PHP</title>
 </head>
 <body>
  <?php echo 'Hello, world!'; ?>
 </body>
</html>

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

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

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

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

[править] Типы данных

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

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

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

Диапазон целых чисел (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 относится к интерпретируемым языкам, позволило реализовать гибкий и удобный механизм обращения к переменным, функциям и классам. Обращение к переменным производится с помощью символа $, за которым следует имя переменной. Данная конструкция может быть применена также для вызова функций, методов и т.п., имя которых совпадает с содержимым переменной. Например:

$a = 'I am a'; //записываем значение в переменную
echo $a;          //Выводим содержимое переменной а
 
$b = 'a';
echo $$b;         //Выводим содержимое переменной а
 
$c = 'function_name';
$c();             //Вызовется функция function_name
 
$d = 'Class_name';
$obj = new $d();  //Создастся объект класса Class_name
 
$obj->$b;         //Обращение к полю a объекта
$obj->$c();       //Вызов метода function_name объекта

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

Общение с внешним миром скрипта PHP происходит через суперглобальные массивы:

  • $_SERVER
  • $_ENV
  • $_GET
  • $_POST
  • $_REQUEST
  • $_FILES
  • $_COOKIE
  • $_SESSION
  • $GLOBALS

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

PHP поддерживает широкие объектно-ориентированные возможности, полная поддержка которых была введена в пятой версии языка.

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

Классы в PHP 5 имеют ряд специальных методов (так называемых «magic methods»), начинающихся с двух символов подчёркивания. Особо стоит отметить конструктор (__construct, в ранних версиях конструктором служил метод, одноименный с классом) и деструктор (__destruct), а также методы чтения (__get) и записи (__set), свёртывания (__sleep) и развёртывания (__wake), клонирования (__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 $a+$b;
  }
/* ...............  */
}
 
$d = new C1(1,2);
echo $d->plus();

[править] Другие возможности

Среди наиболее часто используемых возможностей PHP стоит отметить следующие:

  • имеется большой набор функций для работы со строками;
  • работа с регулярными выражениями PCRE выполняется функциями с префиксом preg_
  • работа с базами данных осуществляется посредством модулей php5-mysql для MySQL, php5-pgsql для PostgreSQL и др. Функции этих модулей позволяют открывать соединение, выполнять SQL-запросы к СУБД, получать данные в удобной для обработки виде и т.д. В серьезных проектах рекомендуется использовать модули абстракции базы данных и объектно-реляционные проекции (ORM);
  • для PHP разработаны средства шаблонирования web-страниц, позволяющие эффективно разделить представление от модели в духе MVC, например Smarty;

[править] Критика

[править] Низкая скорость работы

По сравнению с другими популярными интерпретируемыми языками программирования.[9][10]

[править] Несогласованный синтаксис функций и неортогнальность

PHP предоставляет разработчикам большое количество самых разнообразных функций, которые попали в язык из расширений, создаваемых разными группами программистов. В результате синтаксис не согласован, например, часть функций для работы с массивами начинается с array_, другая часть этим префиксом не обладает. Названия части строковых функций начинается с префикса str, другие функции таким префиксом не обладают. В тех же строковых функциях, обрабатываемая строка может передаваться как в качестве первого, так и в качестве последнего аргумента, что требует постоянного обращения к документации. Многие задачи, например, разбиение строки на массив или подстроки решаются неимоверным количеством разнообразных наборов функций. Все это связано с сильным влиянием Perl, в котором неортогональность является частью концепции. Однако, PHP задумывался как промышленный и ортогональный язык и альтернативные наборы функций для решения одних и тех же задач сильно мешают создавать код в едином стиле. К сожалению, проблема скорее всего не будет решена из соображений обратной совместимости.

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

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

[править] Отсутствие поддержки Unicode в ядре языка

Поддрежка Unicode-строк реализуется через расширение mbstring. При этом вместо стандартных функций работы со строками используются аналогичные функции, но с префиксом mb_. Сами строки не хранят информацию о своей кодировке, и её необходимо указывать вручную при вызове функций расширения mbstring. Проблема скорее всего будет решена в PHP 6.

[править] Отсутствие многопоточности

В языке не предусмотрена возможность создания многопоточных приложений. Есть различные обходные решения с использованием curl [1] и сокетов [2]. Для POSIX-совместимых систем можно использовать функции pcntl_*. Справедливости ради, следует отметить, что PHP распространен главным образом в области Web-разработки, где зачастую проблему многопоточности берет на себя Web-сервер.

[править] Невозможность прямой работы с возвращаемым массивом

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

function odds($N)
{
    return range(0, $N, 2);
}
print odds(10)[2]; //ошибка
$tmp = odds(10); 
print $tmp[2]; // работает

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

[править] Пасхальные яйца

PHP имеет несколько пасхальных яиц (шуток).

Если передать любому php-скрипту в PHP4 специальное значение, можно увидеть авторскую фотографию (обычно фотография чёрного терьера).

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

Если же этот код передать в PHP 5, то увидим несколько «корявый» логотип PHP.

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

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

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

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

Еще один код, работающий на PHP 5 - отображает картинку с иероглифами:

любой_сценарий.php?=SUHO8567F54-D428-14d2-A769-00DA302A5F18

[править] Популярные приложения

Этот раздел не завершён. Вы можете помочь проекту, исправив и дополнив его.

[править] IDE для PHP

Название Лицензия Отладка
Komodo Edit Freeware нет
Komodo IDE Shareware есть
Maguma PHP Open Studio Freeware есть
PHP Development Tools Freeware есть
phpDesigner Shareware есть
PHP Expert Editor Freeware (для всех жителей бывшего СССР) есть
Zend Studio Shareware есть
Eclipse PDT (PHP Development Tools) Freeware есть
NuSphere PHPED Shareware есть
NetBeans IDE Early Access for PHP GPL v2 есть

[править] См. также

[править] Ссылки

[править] Литература

[править] Примечания