Лекция 6
Общее знакомство с PHP. Переменные и их типы. Операторы. Управляющие конструкции.
1. Общее знакомство с PHP
Язык РНР кажется знакомым программистам, работающим в разных областях. Многие конструкции языка позаимствованы из Си Perl.
Рассмотрим процесс выполнения php-сценария при обращении браузера к серверу. Итак, вначале браузер запрашивает страницу с расширением. php, после чего web-сервер пропускает программу через машину PHP и выдаёт результат в виде html-кода. Причем, если взять стандартную страницу HTML, изменить расширение на. php и пропустить её через машину PHP, последняя просто перешлёт её пользователю без изменений. Чтобы включить в этот файл команды PHP, необходимо заключить команды PHP в специальные теги, которых различают несколько видов. Рассмотрим два из них.
1) Стандартные теги используются программистами РНР чаще остальных способов, что объясняется наглядностью и удобством этой формы записи:
<?php print "Welcome to the world of PHP!": ?>
2) Короткие теги обеспечивают наиболее компактную запись для перехода в РНР:
<? print "Welcome to the world of PHP!"; ?>
По умолчанию короткие теги не используются, их нужно специально активизировать. Это можно сделать, включив параметр short_open_tag в файл php. ini.
Вообще говоря, внутри какого-либо блока кода можно выйти из PHP, при условии, что дальше мы войдем в него снова и закончим код. Т. е., возможна следующая конструкция:
<?
if (5>3){
?>
<p>Hello!</p>
<?
}
?>
Комментарии в коде РНР
В РНР существуют два формата комментариев:
Однострочные комментарии обычно используются для коротких пояснений или примечаний, относящихся к локальному коду.
Многострочные комментарии обычно используются при оформлении алгоритмов на псевдокоде и в более подробных объяснениях.
При оформлении однострочных комментариев используется два стиля комментирования. Оба стиля работают абсолютно одинаково, но в них используются разные служебные символы. В одном случае комментарий начинается с двойного символа «косая черта» (//), а в другом — с символа фунта (#).
В РНР существует возможность построения подробных комментариев, занимающих несколько строк. Такие комментарии оформляются в стиле языка С — их начало и конец обозначаются символами /* и */.
Следует помнить о том, что стили комментариев PHP действуют только внутри ограничителей PHP. Если PHP встретит эти символы комментариев вне ограничителей, то они, как и любой текст, будут помещены на html-страницу
2. Переменные и типы данных
Типы данных составляют основу любого языка программирования и являются средством, с помощью которого программист представляет разные типы информации. В РНР поддерживаются шесть основных типов данных:
целые числа;
вещественные числа;
строки;
массивы;
объекты;
логические величины.
Целые числа. В РНР поддерживается запись целых чисел в восьмеричной (по основанию 8) и шестнадцатеричной (по основанию 16) системах счисления. Восьмеричные числа начинаются с цифры 0, после которой следует серия цифр от 0 до 7. Примеры: 0422, 0534
Шестнадцатеричные целые числа имеют префикс 0х или 0Х и могут состоять из цифр от 0 до 9 и букв от а (А) до f (F). Примеры: 0x3FF, 0x22abc
Вещественные числа (числа с плавающей точкой) отличаются от целых наличием дробной части. Они используются для представления значений, требующих повышенной точности, — например, температур или денежных величин. В РНР поддерживаются два вещественных формата: стандартная и научная (экспоненциальная) запись.
Строкой называется последовательность символов, которая рассматривается как единое целое, но при этом обеспечивает доступ к отдельным символам. Примеры строк: thesaurus, 49ers, abc. Строки делятся на две категории в зависимости от типа ограничителя — они могут ограничиваться парой кавычек (" ") или апострофов (' '). Между этими категориями существуют два принципиальных различия. Во-первых, имена переменных в строках, заключенных в кавычки, заменяются соответствующими значениями, а строки в апострофах интерпретируются буквально, даже если в них присутствуют имена переменных,
Два следующих объявления дают одинаковый результат:
$team = "Real";
$team = 'Real';
Однако результаты следующих объявлений сильно различаются:
$s1 = "My favorite team is $team";
$s2 = 'My favorite team is $team';
Переменной $s1 присваивается строка
My favorite team is Real.
Переменной $s2 присваивается строка
My favorite team is $team.
К отдельным символам строки можно обращаться как к элементам массива с последовательной нумерацией (см. следующий раздел). Пример:
$sequence = "04efgh";
$letter = $sequence[4];
Переменной $ letter будет присвоено значение g. В РНР нумерация элементов массивов начинается с 0.
Массивы. Массив представляет собой список однотипных элементов. Существует два типа массивов, различающиеся по способу идентификации элементов. В массивах первого типа элемент определяется индексом в последовательности. Массивы второго типа имеют ассоциативную природу, и для обращения к элементам используются ключи, логически связанные со значениями. Впрочем, на практике операции с массивами обоих типов выполняются сходным образом. По размерности массивы делятся на одномерные и многомерные.
Обобщенный синтаксис элементов одномерного массива:
$имя[индекс1];
Одномерные массивы создаются следующим образом:
$meat[0] = "chicken";
$meat[l] = "steak";
$meat[2] = "turkey";
При выполнении следующей команды:
print $meat[1]:
в браузере выводится строка
steak
При создании массивов также можно воспользоваться функцией array (). Массив $meat из предыдущего примера создается командой
$meat = аrrау("chicken", "steak", "turkey");
Приведенная выше команда print приводит к тому же результату — выводу строки steak.
Чтобы включить новый элемент в конец массива, можно просто присвоить значение переменной массива без указания индекса. Следовательно, массив $meat можно создать еще одним способом:
$meat[] = "chicken";
$meat[] = "steak";
$meat[] = "turkey";
Ассоциативные массивы особенно удобны в ситуациях, когда элементы массива удобнее связывать со словами, а не с числами.
Предположим, вы хотите сохранить в массиве сочетания месяцев и соответствующих им времен года. Проще всего было бы хранить в массиве пары «ключ/значение» :
$mes ["january"] = "Winter";
$mes["february"] = "Winter";
$mes["march"] = "Spring";
$mes["june"] = "Summer";
Ассоциативный массив заметно экономит время и объем программного кода, необходимого для вывода определенных элементов массива. Допустим, вы хотите узнать, к какому времени года относится июнь. Нужная информация выводится простой ссылкой на элемент массива
print $mes ["june"];
В названии ключа допускается использование произвольных символов.
Ассоциативные массивы также можно создавать функцией РНР аггау():
Spairings = аrrау(
january=> "Winter",
february => "Winter",
march => "Spring",
june => "Summer");
Многомерные индексируемые массивы работают практически так же, как и их одномерные прототипы, однако элементы в них определяются несколькими индексами вместо одного. Теоретически размерность индексируемого массива не ограничивается, хотя в большинстве приложений практически не встречаются массивы с размерностью выше 3.
Обобщенный синтаксис элементов многомерного массива:
$имя[индекс1][индекс2]..[индексN];
Пример ссылки на элемент двухмерного индексируемого массива:
$position = $chess_board[5][4];
Аналогично работают и многомерные ассоциативные массивы.
Логические величины
Логический тип данных принимает всего два значения: истинное (true) и ложное (false). Логические величины создаются двумя способами: при проверке условий и в виде значений переменных. Обе ситуации достаточно просты.
Сравнения существуют в нескольких формах. Чаще всего они встречаются при использовании оператора = в условной команде if. Пример:
if ($sum == 40) :
...
Результатом проверки является либо истина, либо ложь: переменная $sum либо равна 40, либо не равна. Если переменная $sum равна 40, проверка дает истинный результат. В противном случае результат равен false.
Логические величины также могут определяться явным присваиванием переменной истинного или ложного значения. Пример:
$flag = TRUE;
if ($flag == TRUE) :
print "The flag is true!";
else :
print "The flag is false!";
endif;
Если переменная $flag истинна, выводится первое сообщение, а если ложна — второе сообщение.
Возможен и другой вариант — представление истинных и ложных логических величин в виде значений 1 и 0 соответственно
Идентификаторы
Общий термин идентификатор применяется к переменным, функциям и другим объектам, определяемым пользователем. Идентификаторы РНР должны удовлетворять нескольким условиям:
Идентификатор состоит из одного или нескольких символов и начинается с буквы или символа подчеркивания. Идентификатор может содержать только буквы, цифры, символы подчеркивания и другие ASCII-символы с кодами от 127 до 255. Примеры:
В идентификаторах учитывается регистр символов. Следовательно, переменная с именем $recipe отличается от переменных с именами $Recipe, $rEciPe и $recipE.
Длина идентификаторов не ограничивается. Это удобно, поскольку программист может точно описать смысл идентификатора в его имени.
Идентификатор не может совпадать с каким-либо из стандартных ключевых слов РНР.
Переменные
Имена переменных всегда начинаются со знака доллара $. Ниже приведены примеры допустимых имен переменных:
$соlоr
$operating_system
$_some_variable
$model
Следует заметить, что переменные в РНР, как и в языке Perl, не требуют специального объявления. Вместо этого переменная объявляется при первом ее использовании в программе. Более того, тип переменной косвенно определяется по типу хранящихся в ней данных. Рассмотрим следующий пример:
$sentence = "This is a sentence."; // $sentence интерпретируется как строка
$price = 42.99: // $price интерпретируется как вещественное число
$weight = 185; // $weight интерпретируется как целое число
Присваивание
Присваивание по значению
Это самый распространенный способ присваивания, при котором значение просто заносится в область памяти, представленную именем переменной. Примеры присваивания по значению:
$vehicle = "car";
$amount =10.23;
Переменные в переменных
В некоторых ситуациях бывает удобно использовать переменные, содержимое которых может динамически интерпретироваться как имя другой переменной. Рассмотрим типичный случай присваивания:
$day = "monday";
Оказывается, строку "monday" можно интерпретировать как имя переменной — для этого в команде присваивания перед именем исходной переменной ставится второй знак $:
$$day = “&new”;
Эта команда присваивает строку "&new" переменной с именем "monday". Следовательно, следующие две команды выводят одинаковые результаты:
print $day $monday;
print $day $($day);
В обоих случаях будет выведена строка "monday&new".
Преобразование типов
Есть функция 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));
?>
Константы
Константы объявляются в РНР при помощи функции define():
define(CONSTANT, value)
Первый параметр этой функции – имя константы, второй – её значение. При использовании константы на неё ссылаются по имени:
<?
define(CONSTANT1,15);
define(CONSTANT2,"Hello");
echo(CONSTANT1);
echo(CONSTANT2);
?>
По традиции имена констант пишут буквами верхнего регистра. Существует функция defined(), которая проверяет, определена ли константа:
<?
define(CONSTANT,"Hello");
if(defined("CONSTANT"))
{
echo("<p>CONSTANT is defined</p>");
}
?>
3. Операторы
Математические операторы
Математические операторы предназначены для выполнения различных математических операций и часто применяются в большинстве программ РНР.
Пример | Название | Результат |
$а + $b | Сложение | Сумма $а и $b |
$а-$b | Вычитание | Разность $а и $b |
$а*$b | Умножение | Произведение $а и $b |
$а/$b | Деление | Частное от деления $а на $b |
$а % $b | Остаток | Остаток от деления $а на $b |
Операторы присваивания
Операторы присваивания задают новое значение переменной. В простейшем варианте оператор присваивания ограничивается изменением величины, в других вариантах (называемых сокращенными операторами присваивания) перед присваиванием выполняется некоторая операция.
Пример | Название | Результат |
$а = 5; | Присваивание | Переменная $а равна 5 |
$а += 5; | Сложение с присваиванием | Переменная $а равна сумме $а и 5 |
$а *= 5; | Умножение с присваиванием | Переменная $а равна произведению $а и 5 |
$а/=5; | Деление с присваиванием | Переменная $а равна частному отделения $а на 5 |
$а.= 5; | Конкатенация с присваиванием | Переменная $а равна конкатенации $а и 5 |
Умеренное использование операторов присваивания обеспечивает более наглядный и компактный код.
Строковые операторы
Строковые операторы РНР обеспечивают удобные средства конкатенации (то есть слияния) строк. Существует два строковых оператора: оператор конкатенации (.) и оператор конкатенации с присваиванием (.=), описанный в предыдущем разделе «Операторы присваивания».
Конкатенацией называется объединение двух и более объектов в единое целое.
Пример | Название | Результат |
$a = "abc"."def" | Конкатенация | abcdef |
$а.= "ghijkl" | Конкатенация с присваиванием | abcdefghijkl |
Операторы инкремента и декремента
Удобные вспомогательные операторы инкремента (++) и декремента (--) делают программу более наглядной и обеспечивают укороченную запись для увеличения или уменьшения текущего значения переменной на 1.
Пример | Название | Результат |
++$а, $а++ | Инкремент | Переменная $а увеличивается на 1 |
--$а, $а-- | Декремент | Переменная $а уменьшается на 1 |
Логические операторы
Логические операторы наряду с математическими операторами играют важную роль в любом приложении РНР, обеспечивая средства для принятия решений в зависимости от значения переменных. Логические операторы позволяют управлять порядком выполнения команд в программе и часто используются в управляющих конструкциях (таких, как условная команда i f, а также циклы for и while).
Пример | Название | Результат |
$а && $b | Конъюнкция | Истина, если истинны оба операнда, |
$aAND$b | Конъюнкция | Истина, если истинны оба операнда |
$а|| $b | Дизъюнкция | Истина, если истинен хотя бы один из операндов |
$а OR $b | Дизъюнкция | Истина, если истинен хотя бы один из операндов |
!$а | Отрицание | Истина, если значение $а ложно |
NOT $a | Отрицание | Истина, если значение $а ложно |
$а XOR $b | Исключающая дизъюнкция | Истина, если истинен только один из операндов |
Операторы равенства
Операторы равенства предназначены для сравнения двух величин и проверки их эквивалентности.
Пример | Название | Результат |
$a==$b | Проверка равенства | Истина, если $а и $b равны |
$а!= $b | Проверка неравенства | Истина, если $а и $b не равны |
$а === $b | Проверка идентичности | Истина, если $а и $b равны и имеют одинаковый тип |
Даже опытные программисты часто допускают одну распространенную ошибку — они пытаются проверять равенство двух величин, используя всего один знак равенства (например, $а = $b). Помните, при такой записи значение $b присваивается $а, и желаемый результат не будет достигнут.
Операторы сравнения
Операторы сравнения, как и логические операторы, позволяют управлять логикой программы и принимать решения при сравнении двух и более переменных.
Пример | Название | Результат |
$a<$b | Меньше | Истина, если переменная $а меньше $b |
$a>$b | Больше | Истина, если переменная $а больше $b |
$a <= $b | Меньше или равно | Истина, если переменная $а меньше или равна $b |
$a >= $b | Больше или равно | Истина, если переменная $а больше или равна $b |
($a=выр1)?выр2: выр3 | Тернарный оператор | Если переменная $а равна значению выражения 1, то возвращается значение выр2, а если не равна — возвращается значение выр3 |
Обратите внимание: операторы сравнения предназначены для работы только с числовыми значениями. Хотя возникает искушение воспользоваться ими для сравнения строк, результат, скорее всего, окажется неверным. В РНР существуют стандартные функции для сравнения строковых величин.
4. Управляющие конструкции
if
Команда if представляет собой разновидность команды выбора, которая вычисляет значение выражения и в зависимости от того, будет ли полученный результат истинным или ложным, выполняет (или не выполняет) блок программного кода. Существует две общих формы команды i f:
if (выражение) {
блок
}
и
if (выражение) {
блок
}
else {
блок
}
Если в результате проверки условия выполняется всего одна команда, фигурные скобки не обязательны:
elseif
Команда elseif добавляет в управляющую конструкцию if дополнительный уровень проверки и увеличивает количество условий, на основании которых принимается решение:
if (выражение) {
блок
}
elseif (выражение) {
блок
}
Команда elself особенно полезна в тех случаях, когда происходит последовательное уточнение проверяемых условий. Обратите внимание: условие elself вычисляется лишь в том случае, если все предшествующие условия if и elself оказались ложными.
if ($weight < 200) {
print "Enough ";
}
elseif ($weight < 500) {
print "a lot of"; }
}
else {
print "Good";
}
В управляющих структурах используются специальные ограничители, определяющие границы блоков. Фигурные скобки ({ }) уже упоминались выше. Для удобства программистов в РНР поддерживается альтернативный формат ограничения блоков:
if (выражение) :
блок
else :
блок
endif;
while
Конструкция while предназначена для многократного (циклического) выполнения блока команд. Блок команды while выполняется до тех пор, пока условие цикла остается истинным. Общая форма цикла while выглядит так:
while (выражение) :
блок
endwhile;
Рассмотрим использование цикла while на примере вычисления факториала (n!), где n = 5:
$n = 5;
$nсору = $n;
$factorial = 1; // Установить начальное значение факториала
while ($n > 0) :
$factorial = $n * $factorial;
$n--; // Уменьшить $n на 1
endwhile;
print "The factorial of $ncopy is $factorial.";
Программа выводит следующий результат:
The factorial of 5 is 120.
do. .while
Цикл do. .while работает почти так же, как и цикл while, описанный в предыдущем разделе, однако в do. .while условие проверяется не в начале, а в конце каждой итерации. Учтите, что цикл do. .while всегда выполняется хотя бы один раз, а цикл while может вообще не выполняться, если перед входом в цикл условие окажется ложным:
do
{
блок }
while (выражение);
В цикле do. .while не поддерживается альтернативный синтаксис (ограничение блоков при помощи : и завершающего ключевого слова), поэтому блок может заключаться только в фигурные скобки.
for
Цикл for обеспечивает еще одну возможность многократного выполнения блоков. Он отличается от цикла while только тем, что условие изменяется в самой
управляющей конструкции, а не где-то внутри блока команд. Как и в случае с циклом while, цикл выполняется до тех пор, пока проверяемое условие остается истинным. Общая форма конструкции for выглядит так:
for (инициализация: условие; приращение) {
блок
}
Условная часть цикла for в действительности состоит из трех компонентов. Инициализация выполняется всего один раз и определяет начальное значение управляющей переменной цикла. Условие проверяется в начале каждой итерации и определяет, должна ли выполняться текущая итерация или нет. Наконец, приращение определяет изменение управляющей переменной при каждой итерации. Возможно, термин «приращение» в данном случае неточен, поскольку переменная может как увеличиваться, так и уменьшаться в соответствии с намерениями программиста. Следующий пример демонстрирует простейший случай применения цикла for:
for ($i = 10; $i <= 100: $i +=10) : // Обратная косая черта предотвращает
print "\$i = $i <br>"; endfor; // возможную интерполяцию переменной $1
Выполнение этого фрагмента дает следующий результат:
$i = 10
$i = 20
$i = 30
$i = 40
$i - 50
$i = 60
$i = 70
$i = 80
$i = 90
$i = 100
В этом примере управляющая переменная $i инициализируется значением 10. Условие заключается в том, что цикл продолжается до тех пор, пока $i не достигнет или не превысит пороговую величину 100. Наконец, при каждой итерации значение $i увеличивается на 10. В результате команда print выполняется 10 раз, каждый раз выводя текущее значение $i. Обратите внимание: для увеличения $i на 10 используется оператор сложения с присваиванием. Для этого есть веские причины, поскольку циклы for в РНР не поддерживают более традиционной записи $i = $i + 10.
В управляющих выражениях циклов for могут отсутствовать любые компоненты. Например, вы можете передать ранее инициализированную переменную прямо в цикл, не присваивая ей определенного начального значения. Возможны и другие ситуации — например, приращение переменной цикла может осуществляться в зависимости от некоторого условия, определяемого в цикле. В этом случае приращение не должно указываться в управляющем выражении. Пример:
$х = 5:
for (: : $х +=2) :
print " $х ";
if ($x == 15) :
break; // Выйти из цикла for
endif;
endfor;
Результат выглядит так:
5 7 9 11 13 15
switch
Принцип работы конструкции switch отчасти напоминает if — результат, полученный при вычислении выражения, проверяется по списку потенциальных совпадений.
Это особенно удобно при проверке нескольких значений, поскольку применение switch делает программу более наглядной и компактной. Общий формат команды switch:
switch (выражение) {
case (условие):
блок
case (условие):
блок
...
default:
блок
}
Проверяемое условие указывается в круглых скобках после ключевого слова switch. Результат его вычисления последовательно сравнивается с условиями в секциях case. При обнаружении совпадения выполняется блок соответствующей секции. Если совпадение не будет обнаружено, выполняется блок необязательной секции default.
Как будет показано в следующих главах, одной из сильнейших сторон РНР является обработка пользовательского ввода. Допустим, программа отображает раскрывающийся список с несколькими вариантами, и каждая строка списка соответствует некоторой команде, выполняемой в отдельной конструкции case. Реализацию очень удобно построить на использовании команды switch:
<?
switch($number)
{
case 1:
echo ("one ");
break;
case 2: case 3:
echo ("free");
break;
case 4: case 5:
echo ("five");
break;
case 6: case 7:
echo ("seven");
break;
case 8: case 9:
echo ("nine");
break;
default:
echo ("This isn't number or number is > 9 or < 1");
}
?>
Переменная, указанная в условии switch (в данном примере — $number), сравнивается с условиями всех последующих секций case. Если значение, указанное в секции case, совпадает Со значением сравниваемой переменной, выполняется блок этой секции. Команда break предотвращает проверку дальнейших секций case и завершает выполнение конструкции switch. Если ни одно из проверенных условий не выполняется, активизируется необязательная секция default. Если секция default отсутствует и ни одно из условий не выполняется, команда switch просто завершается и выполнение программы продолжается со следующей команды.
Вы должны помнить, что при отсутствии в секции case команды break (см. следующий раздел) выполнение switch продолжается со следующей команды до тех пор, пока не встретится команда break или не будет достигнут конец конструкции switch.
В PHP в качестве меток case могут использоваться не только литералы, но и сами метки могут быть переменными. В качестве меток case в PHP не могут выступать только массивы и объекты.
Остается рассмотреть еще одну управляющую конструкцию РНР — continue. При выполнении команды continue в цикле пропускаются все оставшиеся команды текущей итерации и немедленно начинается новая итерация.


