Операції зі змінними 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"
...і ніколи про це не забувайте.
А ось як ще можна записати додавання.
Припустимо, що ми складаємо якийсь складносурядний рядок з різних фрагментів. Ми можемо додавати в кінець нашої змінної нові дані так:
Зручніше, чи не так?
Те саме стосується і математичного додавання:
$ abc + = 1;
Додати 1 до вмісту змінної $abc.
А як ще можна додати одиницю? Зазвичай, по С-шному:
$ abc ++;або ++$abc;
Два цих вирази зазвичай використовуються в циклічних конструкціях. І не самі по собі, а в якомусь складнішому вираженні.
Відмінність цих двох виразів у тому, що у першому випадку значення змінної враховується у вираженні, та був вже виробляється додавання одиниці, тоді як у другому все навпаки -- спочатку відбувається збільшення значення змінної, та був вже отримане значення використовують у виразі. На прикладі стане зрозумілим:
$a=1;
echo $a++;
echo ++$a;
Перше echoроздрукує нам "1", а друге роздрукує?.. а от не правильно! Не 2
воно роздрукує, а "3". Чому? Здогадайтеся самі.
Ще я сьогодні хочу розкласти для вас один фрагмент коду, який ми часто використовуватимемо в нашій програмі. Та й взагалі у будь-якій програмі, де дані черпаються із SQL-бази.
Йдеться, звичайно ж, про отримання даних за допомогою select-А.
Ви вже знаєте, як зробити запит до бази, але ми до ладу не говорили про те, як розбирати отримані дані. А тим часом, це можна робити різними способами.
Давайте одразу на прикладі. Припустимо, ми вибираємо з бази відеокасет найменування відеофільмів, випущених у 2000 році, і хочемо роздрукувати їх у вигляді таблиці (з ID касети, звичайно).
Ось, можна було б оформити процедуру так (у багатьох підручниках ви знайдете щось схоже):
Ми робимо запит до бази (до речі, зверніть увагу на нову для нас умову у запиті: між date and date, така форма часто використовується для визначення діапазону дат).
Ініціюємо текстову змінну для занесення до неї html-коду, додавши перший фрагмент тексту - початок таблиці.
Потім ми відкриваємо цикл з кількістю повторень, що дорівнює кількості отриманих рядків із запиту.
У тілі циклу ми виймаємо з нашого запиту черговий рядок у змінну-масив $film. Функція mysql_fetch_arrayрозкладає дані в асоціативний масив, використовуючи як ключі імена полів з таблиці.
Асоціативний масив - це те ж саме, що і звичайний (нумерований) масив, тільки як імена для осередків використовуються не цифри, а ланцюжки символів. І звертатися до осередків такого масиву слід відповідно: $abc["first"], $abc["mama"]...
Зверніть особливу увагу: звертатися до осередків асоціативних масивів у текстових рядках не можна! Потрібно обов'язково розривати рядок і "вклеювати" значення за допомогою точок(.), як показано.
Але чи не дуже це все громіздко? На мою думку, дуже навіть. Пропоную записати це все інакше: все те саме, але коротше.