PHP 4 на практике




Операторы


Оператор представляет собой символическое обозначение некоторого действия, выполняемого с операндами в выражении. Многие операторы известны любому программисту, но вы должны помнить, что РНР выполняет автоматическое преобразование типов на основании типа оператора, объединяющего два операнда, — в других языках программирования это происходит не всегда.

Приоритет и ассоциативность операторов являются важными характеристиками языка программирования (см. раздел «Ассоциативность операторов» этой главы). В табл. 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 существует;
  • будет выведено сообщение: «File does not exist!».

Операторы равенства

Операторы равенства (табл. 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) «The Art of Assembly Language Programming», доступному по адресу http://webster.cs.ucr.edu/Page_asm/Page_asm.html. Это лучший из ресурсов, которые мне когда-либо встречались в Web.









Начало    Назад    Вперед




Книжный магазин