PHP: Арифметичні оператори. Префіксна форма інкременту

Операції зі змінними PHP (оператори)

Для здійснення існують різні групи.

Оператором називається щось, що складається з одного або більше значень (виразів, якщо говорити на жаргоні програмування), яке можна обчислити як нове значення (отже, вся конструкція може розглядатися як вираз). Звідси випливає, що функції чи будь-які інші конструкції, які повертають значення (наприклад, print()) є операторами, на відміну від решти мовних конструкцій (наприклад, echo()), які нічого не повертають.

Арифметичні операції у PHP

Пам'ятаєте шкільні засади арифметики? Наведені нижче оператори працюють так само.

Операція поділу ("/") завжди повертає речовий тип, навіть якщо обидва значення були цілими (або рядками, які перетворюються на цілі числа). В іншому випадку результат буде дрібним.

Операція обчислення залишку від розподілу " % працює тільки з цілими числами, так що застосування її до дробових може призвести до небажаного результату.

Можливе використання дужок. Пріоритет одних математичних операцій над іншими та зміна пріоритетів при використанні дужок в арифметичних виразах відповідають звичайним математичним правилам.

Операції інкременту та декременту

PHP, аналогічно C, підтримує префіксні та постфіксні оператори інкременту та декременту.

Постфіксні оператори інкременту та декременту

Як і в мові Сі, ці оператори збільшують або зменшують значення змінної, а у виразі повертають значення змінної $aдо зміни. Наприклад:

$a=10;
$b=$a++;
echo "a=$a, b=$b"; // Виводить a = 11, b = 10

Як бачите, спочатку змінною $bнадалося значення змінної $a, А вже потім остання була інкрементована. Втім, вираз, значення якого надається змінною $b, може бути і складніше - у будь-якому випадку, інкремент $aвідбудеться лише після його обчислення.

Префіксні оператори інкременту та декременту

Існують також оператори інкременту та декременту, які вказуються, а не після імені змінної. Відповідно і повертають вони значення змінної вже після зміни. Приклад:

$a=10;
$b=--$a;
echo "a=$a, b=$b"; // Виводить a = 9, b = 9

Операції інкременту та декременту на практиці застосовуються дуже часто. Наприклад, вони зустрічаються практично в будь-якому циклі for .

echo "

Постфіксний інкремент

" ;
$a = 5;
echo "Має бути 5: " . $a++. "
\n" ;

\n" ;

Echo "

Префіксний інкремент

" ;
$a = 5;
echo "Має бути 6: " . ++ $a. "
\n" ;
echo "Має бути 6: " . $a . "
\n" ;

Echo "

Постфіксний декремент

" ;
$a = 5;
echo "Має бути 5: " . $a - . "
\n" ;

\n" ;

Echo "

Префіксний декремент

" ;
$a = 5;
echo "Має бути 4: " . - $a. "
\n" ;
echo "Має бути 4: " . $a . "
\n" ;
?>

Строкові операції

У PHP є два оператори для роботи з рядками. Перший - оператор конкатенації ("."), який повертає об'єднання лівого та правого аргументу. Другий – оператор присвоєння з конкатенацією, який приєднує правий аргумент до лівого. Наведемо конкретний приклад:

$a = "Hello";
$b = $a. "World!" ; // $b містить рядок "Hello World!"

$a = "Hello";
$a .= "World!" ; // $a містить рядок "Hello World!"
?>

Побітові операції

Ці операції призначені для роботи (установки/зняття/перевірки) груп бітів у цілій змінній. Біти цілого числа - це не що інше, як окремі розряди того самого числа, записаного в двійковій системі числення. Наприклад, у двійковій системі число 12 виглядатиме як 1100, а 2 - як 10, так що вираз 12|2 поверне нам число 14 (1110 у двійковому записі). Якщо змінна не ціла, то вона вна-
чале округляється, а потім до неї застосовуються наведені нижче оператори.

Для представлення одного числа використовуються 32 біти:

  • 0000 0000 0000 0000 0000 0000 0000 0000 – це нуль;
  • 0000 0000 0000 0000 0000 0000 0000 0001 – це 1;
  • 0000 0000 0000 0000 0000 0000 0000 0010 – це 2;
  • 0000 0000 0000 0000 0000 0000 0000 0011 – це 3;
  • 0000 0000 0000 0000 0000 0000 0000 0100 – це 4;
  • 0000 0000 0000 0000 0000 0000 0000 0101 – це 5;
  • 0000 0000 0000 0000 0000 0000 0000 1111 - це 15;

Побітові оператори:

приклад Назва Результат
$a & $b Побітове "і" Встановлюються лише ті біти, які встановлені і $a, і $b.
$a | $b Побітове "або" Встановлюються ті біти, які встановлені або $a, або $b.
$a ^ $b Виключне або Встановлюються лише ті біти, які встановлені або тільки $a, або тільки $b
~ $a Заперечення Встановлюються ті біти, які $a не встановлені, і навпаки.
$a<< $b Зрушення вліво Усі біти змінної $a зсуваються на $b позицій вліво (кожна позиція має на увазі "множення на 2")
$a >> $b Зсув праворуч Усі біти змінної $a зсуваються на $b позицій вправо (кожна позиція має на увазі "розподіл на 2")

Операції порівняння

Оператори порівняння, як це видно з їхньої назви, дозволяють порівнювати між собою два значення.

Це своєрідні унікальні операції, тому що незалежно від типів своїх аргументів вони завжди повертають одне з двох: falseабо true. Операції порівняння дозволяють порівнювати два значення між собою і, якщо умова виконана, повертають true, А якщо немає - false.

У PHP дозволяється порівнювати лише скалярні змінні. Масиви та об'єкти в PHP порівнювати не можна. Їх навіть не можна порівнювати на рівність (за допомогою оператора ==), але за виконання такої операції PHP не видає попередження. Так що здивуючись якось, чому два абсолютно різних масиви при порівнянні їх за допомогою == виявляються раптом однаковими, згадайте, що перед порівнянням обидва операнди перетворюються на слово array, яке згодом і порівнюється.

Детально про порівняння масивів дивіться.

Оператори порівняння:

приклад Назва Результат
$a == $b Рівно TRUEякщо $a дорівнює $b.
$a === $b Тотожно TRUEякщо $a дорівнює $b і має той самий тип. (Додано в PHP 4)
$a != $b Не дорівнює TRUEякщо $a не дорівнює $b.
$a<>$b Не дорівнює TRUEякщо $a не дорівнює $b.
$a !== $b Тотожно не одно TRUEякщо $a не дорівнює $b або у випадку, якщо вони різних типів (Додано в PHP 4)
$a< $b Менше TRUEякщо $a строго менше $b.
$a > $b Більше TRUEякщо $a строго більше за $b.
$a<= $b Менше або дорівнює TRUEякщо $a is менше або дорівнює $b.
$a >= $b Більше або дорівнює TRUEякщо $a більше або дорівнює $b.

Логічні операції

Логічні оператори призначені виключно для роботи з логічними висловлюваннями та також повертають falseабо true.

Наведемо таблицю логічних операторів PHP:

Слід зауважити, що обчислення логічних виразів, що містять такі оператори, завжди йде зліва направо, при цьому, якщо результат вже очевидний (наприклад, false&&щосьзавжди дає false), то обчислення обриваються, навіть якщо у виразі є виклики функцій. Наприклад, в операторі $logic = 0&&(time()>100); стандартна функція time()ніколи не буде викликано.

Будьте обережні з логічними операціями – не забувайте про подвоювання символу. Зверніть увагу, що, наприклад, | і || - два абсолютно різні оператори, один з яких може потенційно повертати будь-яке число, а другий - тільки falseі true.

Оператори інкременту (++) та декременту (--) не працюють з логічними змінними.

Оператори еквівалентності

У PHP, починаючи з PHP4, є оператор тотожного порівняння - потрійний знак рівності === ,
або оператор перевірки на. PHP досить терпимо ставиться до того, що рядки неявно перетворюються на числа, і навпаки.
Наприклад, наступний код виведе, що значення змінних дорівнюють:

$a=10;
$ b = "10";

І це незважаючи на те, що змінна $aє числом, а $b- Рядок. Тепер розглянемо дещо інший приклад:

$a=0; // Нуль
$b=""; // порожня стрічка
if($a==$b) echo "a та b рівні"; // Виводить "a та b рівні"

Хоча $aі $bявно не рівні навіть у звичайному розумінні цього слова, скрипт заявить, що вони збігаються. Чому так відбувається? Справа в тому, що якщо один з операндів логічного оператора може трактуватися як число, обидва операнда трактуються як числа. При цьому порожній рядок перетворюється на 0 який потім і порівнюється з нулем. Не дивно, що оператор echoспрацьовує.
Проблему вирішує оператор еквівалентності === (Потрійна рівність). Він лише порівнює два висловлювання, але й їх типи. Перепишемо наш приклад із використанням цього оператора.

У PHP доступні всі основні математичні операції. Як операнди можна використовувати як цілі, так і речові числа.

У таблиці наведено список арифметичних операторів:
ОператорЗнакОпис
Додавання + Додавання двох значень
Віднімання - Віднімання одного значення з іншого
множення * Перемноження двох значень
Поділ / Розподіл одного значення на інше
Отримання залишку від розподілу % Поділ одного значення на інше та повернення залишку (розподіл по модулю)
Інкремент ++ Скорочений запис збільшення числа на одиницю
Декремент -- Скорочений запис зменшення числа на одиницю
Унарне заперечення - Перетворення позитивного числа на негативне або негативного на позитивне

Оператори віднімання, множення, поділу, поділу за модулем та додаванням

Оператори віднімання, множення, поділу, поділу за модулем і складання використовується так само, як і в математиці. Тут варто приділити увагу операторам поділу та поділу по модулю.

Оператор поділу ("/") повертає число з плаваючою точкою, крім випадку, коли обидва значення є цілими числами (або рядками, що перетворюються на цілі числа), які діляться націло - у цьому випадку повертається ціле значення.

result2 = $result2
"; echo "result3 = $result3
result4 = $result4"; ?>

При розподілі по модулю операнди перетворюються на цілі числа (з видаленням дробової частини) на початок операції. Результат операції залишку від розподілу % матиме той самий знак, що й ділене:

Унарне заперечення

Оператор унарного заперечення позначається знаком "-", він змінює значення свого єдиного операнда на протилежне:

В даному випадку круглі дужки не потрібні, тому що унарне заперечення має найвищий пріоритет, але вони допомагають організувати код таким чином, щоб було зрозуміло, що має місце додавання чисел -5 і 4.

Інкремент

Оператор інкременту позначається знаком ++ і може бути розташований з будь-якої сторони від операнда, з яким він працює. Він збільшує це значення на одиницю, так само, як при додаванні одиниці до значення. Фактичний результат залежить від того, де був застосований оператор до або після операнда, з яким він застосовувався. Цей оператор часто використовується зі змінними, і це часто відбувається всередині циклів (про цикли буде розказано далі).

Префіксна форма інкременту

Префіксна форма- це коли оператор інкременту розташований перед операндом, така форма запису означає те, що інкремент буде виконаний першим: він збільшує значення операнда на одиницю і тільки потім вже виконується решта інструкції:

Постфіксна форма інкременту

Постфіксна формазаписується трохи інакше - інкремент розташовується у разі після операнда. При постфіксній формі запису перше використання операнда повертає його поточне значення тільки після цього значення буде збільшено на одиницю:

Декремент

Оператор декремента, позначається знаком - , і на відміну оператора інкременту, зменшує, а чи не збільшує, на одиницю значення свого операнда. Декремент також допускає префіксну та постфіксну форму запису:

Наскільки я зрозумів, зовсім не зайвим виявився опис базових можливостей SQL, яким я трохи перервав наш курс кількома уроками тому.

Сьогодні я хочу знову трохи відхилитися від "курсу партії" і поговорити про конструкції. Але вже не SQL, а самого PHP. Це допоможе вам легше читати листинги програм, а я зможу писати лаконічніше наступні функції, не боячись, що ви мене не зрозумієте.

Не лякайтеся, це зовсім не означає, що я збираюся далі писати все складно та туманно. Ні, нічого подібного. Просто хочу, щоб у вас з'явилося розуміння того, що PHP - не бейсік, де можна писати тільки так, як можна писати. І ніяк інакше. Здорово сказав, сам зрозумів, що написав, Курепін?! Зрозумів зрозумів...

Знайомтеся - точка.

Точку "." ви вже знаєте, вона об'єднує рядки. Плюс "+" - складає цифри, а точка об'єднує рядки.
$a1="100";
$a2="200"
Що буде, якщо скласти $a1і $a2? А це як скласти...
$a1+$a2=300
$a1.$a2="100200"
...і ніколи про це не забувайте.

А ось як ще можна записати додавання.

Припустимо, що ми складаємо якийсь складносурядний рядок з різних фрагментів. Ми можемо додавати в кінець нашої змінної нові дані так:

$this->string_about_letters = $this->string_about_letters."кілька літер..."; $this->string_about_letters = $this->string_about_letters."ще кілька літер..."; $this->string_about_letters = $this->string_about_letters." і ще кілька літер..."; $this->string_about_letters = $this->string_about_letters." знову кілька літер...";
Дещо довго, чи не так? Заважає повторення довгої змінної $this->string_about_letters. Тому запис зробимо інакше:
$this->string_about_letters .= "кілька літер..."; $this->string_about_letters .= "ще кілька літер..."; $this->string_about_letters .= "і ще кілька літер..."; $this->string_about_letters .= "знов кілька літер...";
Зручніше, чи не так?

Те саме стосується і математичного додавання:
$ abc + = 1;
Додати 1 до вмісту змінної $abc.

А як ще можна додати одиницю? Зазвичай, по С-шному:

$ abc ++;або ++$abc;

Два цих вирази зазвичай використовуються в циклічних конструкціях. І не самі по собі, а в якомусь складнішому вираженні.
Відмінність цих двох виразів у тому, що у першому випадку значення змінної враховується у вираженні, та був вже виробляється додавання одиниці, тоді як у другому все навпаки -- спочатку відбувається збільшення значення змінної, та був вже отримане значення використовують у виразі. На прикладі стане зрозумілим:
$a=1;
echo $a++;
echo ++$a;
Перше echoроздрукує нам "1", а друге роздрукує?.. а от не правильно! Не 2 воно роздрукує, а "3". Чому? Здогадайтеся самі.

Ще я сьогодні хочу розкласти для вас один фрагмент коду, який ми часто використовуватимемо в нашій програмі. Та й взагалі у будь-якій програмі, де дані черпаються із SQL-бази.

Йдеться, звичайно ж, про отримання даних за допомогою select-А.

Ви вже знаєте, як зробити запит до бази, але ми до ладу не говорили про те, як розбирати отримані дані. А тим часом, це можна робити різними способами.

Давайте одразу на прикладі. Припустимо, ми вибираємо з бази відеокасет найменування відеофільмів, випущених у 2000 році, і хочемо роздрукувати їх у вигляді таблиці (з ID касети, звичайно).

Ось, можна було б оформити процедуру так (у багатьох підручниках ви знайдете щось схоже):

$this->sql_query="select * from film where f_date between "2000-01-01 00:00:00" and "2000-12-31 23:59:59 order by f_id""; $this->sql_execute(); $str=" "; $row_count=mysql_num_rows($this->sql_res); for($i=0;$isql_res); $str=$str." \n"; ) $str=$str."
".$film["f_id"]."".$film["f_name"]."
";
Пояснюю.

Ми робимо запит до бази (до речі, зверніть увагу на нову для нас умову у запиті: між date and date, така форма часто використовується для визначення діапазону дат).

Ініціюємо текстову змінну для занесення до неї html-коду, додавши перший фрагмент тексту - початок таблиці.

Потім ми відкриваємо цикл з кількістю повторень, що дорівнює кількості отриманих рядків із запиту.

У тілі циклу ми виймаємо з нашого запиту черговий рядок у змінну-масив $film. Функція mysql_fetch_arrayрозкладає дані в асоціативний масив, використовуючи як ключі імена полів з таблиці.


    Асоціативний масив - це те ж саме, що і звичайний (нумерований) масив, тільки як імена для осередків використовуються не цифри, а ланцюжки символів. І звертатися до осередків такого масиву слід відповідно: $abc["first"], $abc["mama"]...
Далі ми додаємо до нашої текстової змінної черговий рядок таблиці, використовуючи отримані з бази дані. Для звернення до даних, як бачите, використовуються назви полів таблиці. Це властивість mysql_fetch_array функції, як я вже сказав.

    Зверніть особливу увагу: звертатися до осередків асоціативних масивів у текстових рядках не можна! Потрібно обов'язково розривати рядок і "вклеювати" значення за допомогою точок(.), як показано.
Цикл повторюється потрібну кількість разів, після чого ми замикаємо $strостаннім html-тегом. Готово.

Але чи не дуже це все громіздко? На мою думку, дуже навіть. Пропоную записати це все інакше: все те саме, але коротше.