| В
этой главе представлены некоторые аспекты, играющие исключительно важную роль
в любом языке программирования, - а именно, выражения, операторы и управляющие
конструкции. Этот материал необходим в первую очередь при создании больших и сложных
приложений РНР. Если вы уже знакомы с такими языками, как С и Java, эта глава
всего лишь напомнит известные вам понятия. Если же вы впервые встречаетесь с этими
терминами и понятиями, которые они обозначают, знание материала этой главы будет
безусловно необходимо для понимания остальных глав книги. Выражения Выражение
описывает некоторое действие, выполняемое в программе. Каждое выражение состоит
по крайней мере из одного операнда и одного или нескольких операторов. Прежде
чем переходить к примерам, демонстрирующим использование выражений, необходимо
поближе познакомиться с операторами и операндами. Операнды Операнд
представляет собой некоторую величину, обрабатываемую в программе. Операнды могут
относиться к любому типу данных, представленному в главе 2. Вероятно, вы уже знакомы
с концепциями обработки и использования операндов не только в повседневных математических
вычислениях, но и по прежнему опыту программирования. Примеры операндов: $а++;
// $а - операнд $sum = $val1 + $val2; // $sum. $val1 и $val2 - операнды Операторы Оператор
представляет собой символическое обозначение некоторого действия, выполняемого
с операндами в выражении. Многие операторы известны любому программисту, но вы
должны помнить, что РНР выполняет автоматическое преобразование типов на основании
типа оператора, объединяющего два операнда, - в других языках программирования
это происходит не всегда. Приоритет и ассоциативность операторов являются
важными характеристиками языка программирования (см. раздел <Ассоциативность
операторов> этой главы). В табл. 3.1 приведен полный список всех операторов,
упорядоченных по убыванию приоритета. Приоритет, ассоциативность и сами операторы
подробно рассматриваются в разделах, следующих за таблицей. Таблица 3.1.
Операторы РНР Оператор Ассоциативность Цель ( ) - Изменение приоритета
new - Создание экземпляров объектов ! ~ П Логическое отрицание, поразрядное
отрицание ++ -- П Инкремент, декремент @ П Маскировка ошибок /
* % Л Деление, умножение, остаток + - . Л Сложение, вычитание, конкатенация
<< >> Л Сдвиг влево, сдвиг вправо (поразрядный) < <=
> >= - Меньше, меньше или равно, больше, больше или равно == != ===
<> - Равно, не равно, идентично, не равно & ^ | Л Поразрядные операции
AND, XOR и OR && || Л Логические операции AND и OR ?: П Тернарный
оператор = += *= /= .= П Операторы присваивания %= &= |= ^= <<=
>>= AND XOR OR Л Логические операции AND, XOR и OR После знакомства
с концепциями операторов и операндов следующие примеры выражений выглядят значительно
понятнее: $а = 5; // Присвоить целое число 5 переменной $а $а = "5":
// Присвоить строковую величину "5" переменной $а $sum = 50 +
$some_int; // Присвоить сумму 50 + $some_int переменной $sum Swine = "Zinfandel";
// Присвоить строку "Zinfandel" переменной $wine $inventory++:
// Увеличить значение $inventory на 1 Объединяя операторы и операнды, вы
получите более сложные выражения для выполнения нетривиальных вычислений. Пример:
$total_cost = $cqst + (Scost * 0.06): // прибавить к цене 6-процентный
налог Приоритет операторов Приоритет является характеристикой операторов,
определяющей порядок выполнения действий с окружающими операндами. В РНР используются
те же правила приоритета, что и в школьном курсе математики. Пример: $total_cost
= $cost + $cost * 0.06; Приведенная команда эквивалентна следующей: $total
cost = $cost + ($cost * 0.06); Это объясняется тем, что оператор умножения
обладает более высоким приоритетом по сравнению с оператором сложения. Ассоциативность
операторов Ассоциативность оператора определяет последовательность выполнения
операторов с одинаковым приоритетом (см. табл. 3.1). Выполнение может происходить
в двух направлениях: либо слева направо, либо справа налево. При ассоциативности
первого типа операции, входящие в выражение, выполняются слева направо. Например,
команда $value = 3*4*5*7*2; эквивалентна следующей команде: $value
= ((((3 * 4) * 5) * 7) * 2); Результат вычислений равен 840. Это объясняется
тем, что оператор умножения (*) обладает левосторонней ассоциативностью. Операторы
с правосторонней ассоциативностью и одинаковым приоритетом обрабатываются справа
налево. Например, фрагмент $с = 5; $value = $а - $b - $с; эквивалентен
фрагменту $c = 5; $value = ($а - ($b - $с)); При обработке
этого выражения переменным $value, $a, $b и $с будет присвоено значение 5. Это
объясняется тем, что оператор присваивания (=) обладает правосторонней ассоциативностью.
Математические операторы Математические операторы (табл. 3.2) предназначены
для выполнения различных математических операций и часто применяются в большинстве
программ РНР. К счастью, их использование обходится без проблем. Таблица
3.2. Математические операторы Пример Название Результат $а
+ $b Сложение Сумма $а и $b $а-$b Вычитание Разность $а
и $b $а*$b Умножение Произведение $а и $b $а/$b Деление
Частное от деления $а на $b $а % $b Остаток Остаток от деления
$а на $b РНР содержит широкий ассортимент стандартных математических
функций для выполнения основных преобразований и вычисления логарифмов, квадратных
корней, геометрических величин и т. д. За обновленным списком таких функций обращайтесь
к документации. Операторы присваивания Операторы присваивания задают
новое значение переменной. В простейшем варианте оператор присваивания ограничивается
изменением величины, в других вариантах (называемых сокращенными операторами присваивания)
перед присваиванием выполняется некоторая операция. Примеры таких операторов приведены
в табл. 3.3. Таблица 3.3. Операторы присваивания Пример Название
Результат $а = 5; Присваивание Переменная $а равна 5 $а += 5; Сложение
с присваиванием Переменная $а равна сумме $а и 5 $а *= 5; Умножение с присваиванием
Переменная $а равна произведению $а и 5 $а/=5; Деление с присваиванием Переменная
$а равна частному отделения $а на 5 $а .= 5; Конкатенация с присваиванием
Переменная $а равна конкатенации $а и 5 Умеренное использование операторов
присваивания обеспечивает более наглядный и компактный код. Строковые операторы
Строковые операторы РНР (табл. 3.4) обеспечивают удобные средства конкатенации
(то есть слияния) строк. Существует два строковых оператора: оператор конкатенации
(.) и оператор конкатенации с присваиванием (.=), описанный в предыдущем разделе
<Операторы присваивания>. Конкатенацией называется объединение двух
и более объектов в единое целое. Таблица 3.4. Строковые операторы Пример
Название Результат $a = "abc"."def" Конкатенация
Переменной $а присваивается результат конкатенации $а и $b $а - "ghijkl"
Конкатенация с присваиванием Переменной $а присваивается результат конкатенации
ее текущего значения со строкой "ghijkl" Пример использования
строковых операторов: // $а присваивается строковое значение "Spaghetti
& Meatballs" $а = "Spaghetti" . "& Meatballs" //
$а присваивается строковое значение "Spaghetti & Meatballs are delicious"
$a .= "are delicious"; Конечно, два строковых оператора не исчерпывают
всех возможностей РНР по обработке строк. За полной информацией об этих возможностях
обращайтесь к главе 8. Операторы инкремента и декремента Удобные
вспомогательные операторы инкремента (++) и декремента (--), приведенные в табл.
3.5, делают программу более наглядной и обеспечивают укороченную запись для увеличения
или уменьшения текущего значения переменной на 1. Таблица 3.5. Операторы
инкремента и декремента Пример Название Результат ++$а, $а++ Инкремент
Переменная $а увеличивается на 1 --$а, $а-- Декремент Переменная $а уменьшается
на 1 Интересный факт: эти операторы могут располагаться как слева, так
и справа от операнда. Действия, выполняемые оператором, зависят от того, с какой
стороны от операнда он находится. Рассмотрим следующий пример: $inventory
= 15; // Присвоить Sinventory целое число 15 $old_inv = Sinventory--; //
СНАЧАЛА присвоить $old_inv значение // Sinventory. а ЗАТЕМ уменьшить Sinventory. $orig_iinventory
= ++inventory;// СНАЧАЛА увеличить Sinventory. а ЗАТЕМ // присвоить увеличенное
значение Sinventory // переменной $orig_inventory. Как видите, расположение
операторов инкремента и декремента оказывает сильное влияние на результат вычислений.
Логические операторы Логические операторы (табл. 3.6) наряду с математическими
операторами играют важную роль в любом приложении РНР, обеспечивая средства для
принятия решений в зависимости от значения переменных. Логические операторы позволяют
управлять порядком выполнения команд в программе и часто используются в управляющих
конструкциях (таких, как условная команда i f, а также циклы for и while). Таблица
3.6. Логические операторы Пример Название Результат $а
&& $b Конъюнкция Истина, если истинны оба операнда , $aAND$b
Конъюнкция Истина, если истинны оба операнда $а И $b Дизъюнкция
Истина, если истинен хотя бы один из операндов $а OR $b Дизъюнкция
Истина, если истинен хотя бы один из операндов !$а Отрицание
Истина, если значение $а ложно NOT !$a Отрицание Истина,
если значение $а ложно $а XOR $b Исключающая дизъюнкция Истина,
если истинен только один из операндов Логические операторы часто используются
для проверки результата вызова функций: file_exists("filename.txt")
OR print "File does not exist!"; Возможен один из двух вариантов:
файл filename.txt существует; будет выведено сообщение: . Операторы
равенства Операторы равенства (табл. 3.7) предназначены для сравнения двух
величин и проверки их эквивалентности. Таблица 3.7. Операторы равенства Пример
Название Результат $a==$b Проверка равенства Истина, если $а
и $b равны $а != $b Проверка неравенства Истина, если $а и $b не равны $а
=== $b Проверка идентичности Истина, если $а и $b равны и имеют одинаковый
тип Даже опытные программисты часто допускают одну распространенную
ошибку - они пытаются проверять равенство двух величин, используя всего один знак
равенства (например, $а = $b). Помните, при такой записи значение $b присваивается
$а, и желаемый результат не будет достигнут. Операторы сравнения Операторы
сравнения (табл. 3.8), как и логические операторы, позволяют управлять логикой
программы и принимать решения при сравнении двух и более переменных. Таблица
3.8. Операторы сравнения Пример Название Результат $a<$b
Меньше Истина, если переменная $а меньше $b $a>$b Больше
Истина, если переменная $а больше $b $a <= $b Меньше или
равно Истина, если переменная $а меньше или равна $b $a >= $b
Больше или равно Истина, если переменная $а больше или равна $b
($a-12)?5: -1 Тернарный оператор Если переменная $а равна 12, возвращается
значение 5, а если не равна - возвращается 1 Обратите внимание: операторы
сравнения предназначены для работы только с числовыми значениями. Хотя возникает
искушение воспользоваться ими для сравнения строк, результат, скорее всего, окажется
неверным. В РНР существуют стандартные функции для сравнения строковых величин.
Эти функции подробно рассматриваются в главе 8. Поразрядные операторы Поразрядные
операторы выполняют операции с целыми числами на уровне отдельных битов, составляющих
число. Чтобы лучше понять принцип их работы, необходимо иметь хотя бы общее представление
о двоичном представлении десятичных чисел. В табл. 3.9 приведены примеры десятичных
чисел и соответствующих им двоичных представлений. Таблица 3.9. Десятичные
числа и их двоичные представления Десятичное целое Двоичное представление
2 10 5 101 10 1010 12 1100 145 10010001 1 452 012 1011000100111111101100
Поразрядные операторы, перечисленные в табл. 3.10, представляют собой особый
случай логических операторов, однако они приводят к совершенно иным результатам.
Таблица 3.10. Поразрядные операторы Пример Название Результат
$а&$b Конъюнкция С битами, находящимися в одинаковых разрядах
$а и $b, выполняется операция конъюнкции $а|$Ь Дизъюнкция С
битами, находящимися в одинаковых разрядах $а и $b, выполняется операция дизъюнкции
$а^$b Исключающая С битами, находящимися в одинаковых
разрядах $а и $b, выполняется операция исключающей дизъюнкции ~$b
Отрицание Все разряды переменной $b инвертируются $а << $b
Сдвиг влево Переменной $а присваивается значение $b, сдвинутое влево
на два бита $а >> $b Сдвиг вправо Переменной $а присваивается
значение $b, сдвинутое вправо на два бита Если вам захочется больше
узнать о двоичном представлении и поразрядных операторах, я рекомендую обратиться
к обширному электронному справочнику Рэндалла Хайда (Randall Hyde) , доступному
по адресу http://webster.cs.ucr.edu/Page_asm/Page_asm.html. Это лучший из ресурсов,
которые мне когда-либо встречались в Web.
|