Основы синтаксиса PHP

advertisement
1
Занятие 2.
Основы синтаксиса PHP
Как выглядит PHP-программа
Программы PHP могут выполняться двумя способами: как сценарное приложение Webсервером и как консольные программы. Поскольку, нашей задачей является программирование
web-приложений, мы преимущественно будем рассматривать первый способ.
В отличие от традиционных скриптовых языков (таких, как Perl), PHP-программа
представляет собой HTML-страницу со вставками кода. Для сравнения:
Perl-скрипт:
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "<html>\n<head><title>Hello World</title></head>\n";
print "<body><h1>Hello World!</h1></body>\n";
print "</html>";
PHP-скрипт:
<html>
<head><title>Hello World</title></head>
<body><h1>Hello World!</h1></body>
</html>
Как видите, простейшая программа на PHP - это обычная HTML-страница. О выводе
заголовка Content-type: text/html PHP тоже позаботился самостоятельно.
Непосредственно PHP-код (который - не HTML:) размещается между тэгами <? и ?>.
Все, что расположено между этими тэгами, заменяется на выведенный скриптом внутри этого
блока HTML-кодом (в частном случае - если скрипт ничего не выводит - просто "исчезает").
Вообще, универсальный (то есть - гарантированно работающий при любой конфигурации PHP), но более
длинный способ спецификации PHP-кода - тэги <?php ... ?>. Такая длинная форма записи используется при
совмещении XML и PHP, так как тэг <? ... ?> используется в стандарте XML.
За распознавание тэга <? как начала PHP-блока отвечает директива short_open_tag файла php.ini (по
умолчанию - включена). Если вы хотите разрабатывать скрипты, работающие независимо от данной
настройки, используйте длинный открывающий тэг <?php.
Рассмотрим простой пример.
<html>
<head><title>Hello World</title></head>
<body><h1>Hello World!</h1>
<p>Текущая дата:
<?
echo date("d.m.Y");
?>
2
</body>
</html>
Если сегодня - 23-е сентября 2004 года, в результате исполнения скрипта браузер
получит следующий HTML-код:
<html>
<head><title>Hello World</title></head>
<body><h1>Hello World!</h1>
<p>Текущая дата:
23.09.2004</body>
</html>
Строки 5,6,7 - вставка PHP-кода. На строках 5 и 7 расположены соответственно
открывающий и закрывающий тэг. Их совершенно необязательно располагать на отдельных
строках - это сделано по соображениям удобства чтения.
В строке 6 расположен оператор echo, используемый для вывода в браузер. Выводит же
он результат выполнения функции date - в данном случае это текущая дата.
Строка 6 является законченным выражением. Каждое выражение в PHP заканчивается
точкой с запятой - ;.
Комментарии в PHP
PHP предоставляет несколько методов для вставки комментариев. Проще всего
пользоваться двойным слэшем (//), после чего PHP машина игнорирует все, что расположено до
конца строки. Также можно пользоваться многострочными комментариями в стиле С (/*…*/).
Для однострочных комментариев можно еще пользоваться символом решетки (#) (комментарий
скриптовых языков UNIX).
<?php
echo("<p>Hello</p>"); // комментарий
echo("<p>Hello</p>"); # комментарий
/*
и это тоже комментарии
*/
?>
Следует помнить о том, что стили комментариев PHP действуют только внутри
ограничителей PHP. Если PHP встретит эти символы комментариев вне ограничителей, то они,
как и любой текст, будут помещены на html-страницу. Например:
<?php
echo("<p>Hello</p>"); // нормальный комментарий
?>
// а вот этот комментарий отобразиться броузером.
<!-- Комментарий HTML.
Будет виден в исходном коде HTML, но не в браузере -->
3
Заметим, что комментарии можно вставлять не только после конца оператора, а,
например, и вот так:
<?
$a = "Hello, world";
echo strstr($a,"H");
// эту функцию мы рассмотрим позднее
?>
Переменные
Как и в любом другом языке программирования (за исключением, может быть, языка
Forth), в PHP существует такое понятие как переменная.
В РНР переменные начинаются со знака доллара ($).
За этим знаком может следовать любое количество буквенно-цифровых символов и
символов подчеркивания, но первый символ после знака $ не может быть цифрой или
подчеркиванием.
Следует также помнить, что имена переменных в РНР чувствительны к регистру, в
отличие от ключевых слов, т.е. $A и $a - это две разные переменные.
При объявлении переменных в РНР не требуется явно указывать тип переменной, при
этом одна и та же переменная может иметь на протяжении программы разные типы.
Переменная инициализируется в момент присваивания ей значения и существует до тех
пор, пока выполняется программа. Т.е., в случае web-страницы это означает, что до тех пор,
пока не завершен запрос.
Для присваивания переменной значения используется оператор =.
Пример:
1: <?
2: $a = 'test';
3: $copyOf_a = $a;
4: $Number100 = 100;
5: echo $a;
6: echo $copyOf_a;
7: echo $Number100;
8: ?>
Данный код выведет: testtest100.
Следите за тем, какие имена вы даете переменным: вряд ли вы через полгода вспомните, для чего
используется переменная $a21 или $zzz. :) А вот для чего используется переменная $username, понять
довольно легко.
В строке 2 переменной $a присваивается строковое значение 'test'. Строки в PHP
записываются в кавычках - одинарных или двойных (различие между записями в разных
4
кавычках мы рассмотрим чуть позже). Также справедливо высказывание, что переменная $a
инициализируется значением 'test': в PHP переменная создается при первом присваивании ей
значения; если переменной не было присвоено значение - переменная не определена, то есть ее
просто не существует.
В строке 3 переменная $copyOf_a инициализируется значением переменной $a; в данном
случае (смотрим строку 2) это значение - строка 'test'. В строке с номером 4 переменной с
именем $Number100 присваивается числовое значение 100.
Внешние переменные
После того, как запрос клиента проанализирован веб-сервером и передан РНР машине,
последняя устанавливает ряд переменных, которые содержат данные, относящиеся к запросу и
доступны все время его выполнения. Сначала РНР берет переменные окружения Вашей
системы и создает переменные с теми же именами и значениями в окружении сценария РНР для
того чтобы сценариям, расположенным на сервере были доступны особенности системы
клиента. Эти переменные помещаются в ассоциативный массив $HTTP_ENV_VARS.
Естественно, что переменные массива $HTTP_ENV_VARS являются системно
зависимыми (поскольку это фактически переменные окружения). Посмотреть значения
переменных окружения для Вашей машины Вы можете при помощи команды env (Unix) или set
(Windows).
Затем РНР создает группу GET-переменных, которые создаются при анализе строки
запроса. Строка запроса хранится в переменной $QUERY_STRING и представляет собой
информацию, следующую за символом "?" в запрошенном URL. РНР разбивает строку запроса
по символам & на отдельные элементы, а затем ищет в каждом из этих элементов знак "=". Если
знак "=" найден, то создается переменная с именем из символов, стоящих слева от знака
равенства. Рассмотрим следующую форму:
<form action = "http://localhost/PHP/test.php" method="get">
HDD: <input type="text" name="HDD"/><br>
CDROM: <input type="text" name="CDROM"/><br>
<input type="submit">
</form>
Если Вы в этой форме в строке HDD наберете, к примеру, "Maxtor", а в строке CDROM
"Nec", то она сгенерирует следующую форму запроса:
http://localhost/PHP/test.php?HDD=Maxtor&CDROM=Nec
В нашем случае
$CDROM = "Nec".
РНР
создаст
следующие
переменные:
$HDD = "Maxtor"
и
Вы можете работать с этими переменными из Вашего скрипта (у нас – test.php) как с
обычными переменными. В нашем случае они просто выводятся на экран:
<?
echo("<p>HDD is $HDD</p>");
5
echo("<p>CDROM is $CDROM</p>");
?>
Если запрос страницы выполняется при помощи метода POST, то появляется группа
POST-переменных, которые интерпретируются также и помещаются в массив
$HTTP_POST_VARS.
Константы
Константы объявляются в РНР при помощи функции define():
define(CONSTANT, value)
Первый параметр этой функции – имя константы, второй – её значение. При
использовании константы на неё ссылаются по имени:
<?
define(CONSTANT1,15);
define(CONSTANT2,"\x20"); // код пробела
define(CONSTANT3,"Hello");
echo(CONSTANT1);
echo(CONSTANT2);
echo(CONSTANT3);
?>
По традиции имена констант пишут буквами верхнего регистра. И хотя это только
традиция, мы Вам рекомендуем ей следовать, поскольку плохие программисты получаются в
том числе и из тех, кто не следовал хорошим традициям J. Существует функция defined(),
которая проверяет, определена ли константа:
<?
Define (CONSTANT,"Hello");
if (defined("CONSTANT"))
{
echo("<p>CONSTANT is defined</p>");
}
?>
Типы данных в РНР. Преобразование типов
Как уже было сказано, PHP предоставляет определенную гибкость в отношении типов
переменных, т.е. с одной и той же переменной на протяжении программы можно работать и как
со строкой, и как с числом. Однако, несмотря на это в РНР существуют набор основных типов
данных, которые могут явно указываться при работе с переменными:





integer
string
boolean
double
array
-
целое число;
строка любой длины;
логический тип;
вещественное число;
ассоциативный массив;
6
 object
-
объект;
Есть функция gettype(), возвращающая тип, который РНР назначил переменной:
<?
$var = "5";
$var1 = 5;
echo(gettype($var));
echo "<br>";
echo(gettype($var1));
?>
В первом случае РНР вернет string, во втором integer.
Существует также функция settype(), которая явно устанавливает тип:
<?
$var = "5";
echo(gettype($var));
settype($var,integer);
echo "<br>";
echo(gettype($var));
?>
Выполнение этого фрагмента кода приведет к такому же результату, как и предыдущего.
Кроме функции settype() преобразование типов в РНР можно осуществлять при помощи
операторов преобразования типов. Преобразование типов осуществляется путем указания перед
переменной ее нового типа, взятого в скобки:
$var = (int)$var;
Соответственно, выполнение следующего кода приведет к тому, что РНР вернет integer:
<?
$var = "5"; // тип string
$var = (int)$var; // преобразуем в int
echo(gettype($var));
?>
Операторы
Арифметические операторы
+
Сложение
-
Вычитание
*
Умножение
/
Деление
7
%
Вычисление остатка по модулю (к примеру: 5 % 2=1)
Поразрядные операторы
Эта группа операторов работает с битовыми представлениями значений целочисленных
операндов. В основном эти операторы применяются для создания набора булевых флагов. В
наших упражнениях мы будем использовать эти операторы очень редко, однако на всякий
случай ниже приведен пример с использованием этих операторов.
&
Поразрядная конъюнкция (AND)
|
Поразрядная дизъюнкция (OR)
^
Поразрядное исключающее ИЛИ (XOR)
~
Поразрядное отрицание (NOT)
<<
Сдвиг влево битового представления значения левого целочисленного операнда
на количество разрядов, равное значению правого целочисленного операнда
>>
Сдвиг вправо битового представления значения левого целочисленного операнда
на количество разрядов, равное значению правого целочисленного операнда
Пример:
<?
echo(4<<2); // равно 16
echo"<br>";
echo(5>>1); // равно 2
echo"<br>";
echo(6&5); // равно 4
echo"<br>";
echo(6|5); // равно 7
echo"<br>";
echo(6^5); // равно 3
>?
Разберем первый пример. Двоичный код для 4 равен 100, при сдвиге влево на 2 разряда
код 100 становится равным 10000, что соответствует десятичному значению 16. Остальные
примеры могут быть разобраны аналогично. Обратим внимание на то, что сдвиг влево на n
позиций эквивалентен умножению на 2n, а сдвиг вправо уменьшает соответствующее значение
в 2n раз с отбрасыванием дробной части результата (поэтому 5>>1 равно 2). Основное
назначение этих операторов – быстрые вычисления. Так как их поддержка осуществляется на
аппаратном уровне (процессор), алгоритмы, выполненные с использованием данных операторов
получаются очень производительными.
Логические операторы
Or
или || ИЛИ
8
Xor
исключающее ИЛИ
And или && И
!
НЕ
Операторы этой группы, в отличие от поразрядных, работают с логическими
переменными (boolean) и интенсивно используются в управляющих конструкциях: циклы и
условия. Логические переменные, или более правильно, переменные типа Boolean имеют лишь
два значения: true(истина) и false(ложь). В выражениях true и false можно заменить на 1(любое
отличное от 0 число) и 0, соответственно. Возможность замены true и false на 1 и 0 – это
«наследство» языка С, в котором не было специальных переменных true и false.
Логически операторы для переменных типа Boolean выполняют роль операторов
сложения, вычитания для обычных переменных. Рассмотрим несколько примеров, если их
смысл Вам не очень понятен – не расстраивайтесь, просто более подробно разберем их позднее.
Оператор if(cond) проверяет условие cond, если его значение true – выполняется код в фигурных
скобках, следующий за if, если false – код после оператора else. Если cond равен false – всё
наоборот.
Рассмотрим еще один пример:
1: <?
2: $greeting = 'Привет';
3: $name = 'Вася';
4: $message = "$greeting, $name!";
5: echo $message;
6: ?>
Особого внимания заслуживает четвертая строка. Внутри двойных кавычек указаны
переменные, определенные в предыдущих строках. Если выполнить эту программу, в окне
браузера отобразится строка Привет, Вася!. Собственно, в этом и заключается основная
особенность двойных кавычек: имена переменных, указанных внутри пары символов ",
заменяются на соответствующие этим переменным значения.
Помимо этого, внутри двойных кавычек распознаются специальные управляющие
комбинации, состоящие из двух символов, первый из которых - обратный слэш (\). Наиболее
часто используются следующие управляющие символы:
\r - возврат каретки (CR)
\n - перевод строки (NL)
\" - двойная кавычка
\$ - символ доллара ($)
\\ - собственно, обратный слэш (\)
9
Символы \r и \n обычно используются вместе, в виде комбинации \r\n - так обозначается
перевод строки в Windows и многих TCP/IP-протоколах. В Unix новая строка обозначается
одним символом \n; обычно такой способ перевода строки используется и в HTML-документах
(конечно же, это влияет только на HTML-код, но не отображение в браузере (если только текст
не заключен в пару тэгов <pre>...</pre>): для отображаемого перевода строки, как известно,
используется тэг <br>).
Оставшиеся три пункта из приведенного списка применения обратного слэша являются
примерами экранирования - отмены специального действия символа. Так, двойная кавычка
обозначала бы конец строки, символ доллара - начало имени переменной, а обратный слэш начало управляющей комбинации. При экранировании, символ воспринимается "как он есть", и
никаких специальных действий не производится.
Экранирование в PHP используется во многих случаях, так что с этим подходом мы еще
не раз встретимся.
Если в данном примере кавычки заменить на одинарные, в браузере отобразится именно
то, что внутри них написано ($greeting, $name!). Комбинации символов, начинающиеся с \, в
одинарных кавычках также никак не преобразуются, за двумя исключениями: \' - одинарная
кавычка внутри строки; \\ - обратный слэш (в количестве одна штука :).
Немного изменим наш последний пример:
1: <?
2: $greeting = 'Привет';
3: $name = 'Вася';
4: $message = $greeting . ',' . $name. '!';
5: echo $message;
6: ?>
На этот раз мы не стали пользоваться "услужливостью" двойных кавычек: в строке 4
имена переменных и строковые константы записаны через оператор конкатенации (объединения
строк). В PHP конкатенация обозначается точкой – «.». Результат выполнения этой программы
аналогичен предыдущему примеру.
Download