Простейшая программа 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 <% %>
(конструкции <? ?>
и <% %>
могут быть выключены в конфигурационном файле php.ini).
Имена переменных начинаются с символа $, тип переменной объявлять не нужно. В отличие от имён функций и классов, имена переменных чувствительны к регистру. Переменные обрабатываются в строках, заключённых в апострофы или двойные кавычки, и heredoc-строках (строках, созданных при помощи оператора <<<).
PHP рассматривает переход на новую строку как пробел, так же как HTML и другие языки со свободным форматом. Инструкции разделяются с помощью точки с запятой (;), за исключением некоторых случаев.
PHP поддерживает три типа комментариев: в стиле языка Си (ограниченные /* */), C++ (начинающиеся с // и идущие до конца строки) и оболочки UNIX (с # до конца строки).
Типы данных
PHP является языком программирования с динамической типизацией, не требующим указания типа при объявлении переменных, равно как и самого объявления переменных. Преобразования между скалярными типами зачастую осуществляются неявно без дополнительных усилий (впрочем, PHP предоставляет широкие возможности и для явного преобразования типов).
К скалярным типам данных относятся:
- целый тип (integer),
- вещественный тип данных (float, double),
- логический тип (boolean),
- строковый тип (string)
- и специальный тип NULL.
К нескалярным типам относятся:
Диапазон целых чисел (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) поддерживают числовые и строковые ключи и являются гетерогенными. Массивы могут содержать значения любых типов, включая другие массивы. Порядок элементов и их ключей сохраняется.
Обращение к переменным и функциям
Обращение к переменным осуществляется с помощью символа $, за которым следует имя переменной. Данная конструкция может быть применена также для создания динамических переменных и функций.[10] Например:
$a = 'I am a'; // Запись значение в переменную $a
echo $a; // Вывод переменной $а
$b = 'a';
echo $$b; // Вывод переменной $а
$c = 'function_name';
$c(); // Вызов функции function_name
$d = 'Class_name';
$obj = new $d(); // Создастся объект класса Class_name
$obj->b; // Обращение к полю b объекта
$obj->c(); // Вызов метода c() объекта
// но:
$obj->$b; // Обращение к полю a объекта, т.к. $b = 'a'
$obj->$c(); // Вызов метода function_name() объекта
Суперглобальные массивы
Суперглобальными массивами (англ. Superglobal arrays) в PHP называются предопределённые массивы. Большая часть этих массивов содержит входные данные запроса пользователя (параметры POST, куки и т. п.).
Все суперглобальные массивы кроме $GLOBALS и $_REQUEST имеют устаревшие аналоги с длинными именами, которые доступны вплоть до пятой версии PHP (в шестой версии планируется их исключение). Таким образом, обращения $_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» в форме и, в свою очередь, также является массивом со следующими элементами:
- $_COOKIE (уст. $HTTP_COOKIE_VARS)
- Ассоциативный массив с переданными агентом пользователя значениями куки.
- $_REQUEST
- Содержит элементы из массивов $_GET, $_POST, $_COOKIE. С версии PHP 4.1 включает $_FILES.
- $_SESSION (уст. $HTTP_SESSION_VARS)
- Содержит данные сессии.
Объектно-ориентированное программирование
PHP поддерживает широкие объектно-ориентированные возможности, полная поддержка которых была введена в пятой версии языка.
Класс в PHP объявляется с помощью ключевого слова class. Методы и поля класса могут быть общедоступными (public, по умолчанию), защищёнными (protected) и скрытыми (private). PHP поддерживает все три основных механизма ООП — инкапсуляцию, полиморфизм и наследование (родительский класс указывается с помощью ключевого слова extends после имени класса). Поддерживаются интерфейсы (ставятся в соответствие с помощью implements). Разрешается объявление финальных, абстрактных методов и классов. Множественное наследование классов не поддерживается, однако класс может реализовывать несколько интерфейсов. Для обращения к методам родительского класса используется ключевое слово parent.
Классы в PHP имеют ряд специальных методов (англ. 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 предоставляет разработчикам большое количество самых разнообразных функций, которые попали в язык из расширений, создаваемых разными группами программистов. В результате синтаксис языка не согласован, например, часть функций для работы с массивами начинается с префикса array_
, другая часть этим префиксом не обладает. Названия части строковых функций начинается с префикса str
, другие функции таким префиксом не обладают. В тех же строковых функциях обрабатываемая строка может передаваться как в качестве первого, так и в качестве последнего аргумента, что требует постоянного обращения к документации. Многие задачи, например разбиение строки на массив или подстроки, решаются неимоверным количеством разнообразных наборов функций. Все это связано с сильным влиянием
Отсутствие обратной совместимости между версиями языка
Код, созданный для более ранних версий языка, зачастую не работает или работает некорректно с более поздними версиями языка. В более поздних версиях исключаются конструкции, методики, функции, применявшиеся ранее. В результате, приложения, созданные несколько лет назад, практически теряют работоспособность для современных версий языка и требуют значительной модификации. Такие изменения обусловлены двумя факторами: устранение несогласованного синтаксиса и устранение конструкций, поощряющих создание небезопасного кода. Справедливости ради, следует отметить, что отсутствие обратной совместимости вообще характерно для современных интерпретируемых языков.
Отсутствие поддержки Unicode в ядре языка
Поддержка Unicode-строк реализуется через расширение mbstring
. При этом вместо стандартных функций работы со строками используются аналогичные функции, но с префиксом mb_
. Сами строки не хранят информацию о своей кодировке, и её необходимо указывать вручную при вызове функций расширения mbstring
. Проблема, скорее всего, будет решена в PHP 6.
Отсутствие многопоточности
В языке не предусмотрена возможность создания многопоточных приложений. Есть различные обходные решения с использованием [11] и сокетов.[12][13][14] Для pcntl_. Справедливости ради, следует отметить, что PHP распространен главным образом в области Web-разработки, где зачастую проблему многопоточности берет на себя веб-сервер.
Отсутствие прямого обращения к возвращаемому массиву
В языке PHP массив, возвращаемый функцией или методом, необходимо предварительно занести в переменную, чтобы применить оператор […]. Пример:
function odds($N)
{
return range(0, $N, 2);
}
print odds(10)[2]; //ошибка
$tmp = odds(10);
print $tmp[2]; // работает
Эта проблема, скорее всего, не будет решена, так как PHP, в отличие от других языков программирования, позволяет работать не только с индексными массивами, но и с ассоциативными. Однако PHP поддерживает конструкцию list(), предлагающую концептуально иной способ работы с массивами, предоставляя разработчику возможность поместить элементы массива сразу в переменные.
Пасхальные яйца
PHP имеет несколько пасхальных яиц (шуток).Передача специальных GET-параметров любому 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-скрипте с помощью функций php_logo_guid и zend_logo_guid для логотипа Zend.
Также имеется специальное значение для отображения списка всех авторов PHP (4,5):
любой_сценарий.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
Популярные приложения
Интегрированные среды разработки для PHP