Лекція № 2
Тема: Змінні і типи даних
План
Правила задання змінних
Типи даних
Функції визначення і завдання типу змінних.
Логічні змінні і їх особливості в РНР
Практично у всіх мовах програмування є таке поняття, як змінна. Чому я спожив вираз «Практично у всіх»? Існують і такі мови, в яких немає змінних, як таких. На щастя, РНР не відноситься до таких мов — він найзвичайніша мова, з погляду наявності змінних.
Змінна — це область оперативної пам'яті, доступ до яких здійснюється по імені. Всі дані, з якими працює програма, зберігаються у вигляді змінних.
Правила задання змінних
Як вже наголошувалося вище, в РНР обов'язково перед ім'ям змінної потрібно ставити знак долара — так інтерпретатору легше виділити змінні з «сірої маси» тексту програми.
У офіційній документації РНР сказане, що імена змінних можуть складатися не тільки з латинських букв, але з будь-яких символів, код яких більше 127. Це означає, що імена змінних можуть містити російські букви. Проте я настійно раджу вам не використовувати російськомовні імена — адже в різних кодуваннях букви кирилиці мають різні коди.
Визначимо правила завдання змінних в РНР:
Ім'я змінної повинне починатися із знаку долара $.
Ім'я змінної не повинне містити ніяких інших символів, окрім символів латинського алфавіту, цифр і знаку підкреслення. Якщо ви використовуватимете це правило, ви істотно полегшите собі життя.
Імена змінних в РНР, як і в C, чутливі до регістра символів, тобто змінні $а і $А — це здійснено разні змінні.
Оголошувати змінну можна в будь-якому місці програми, але до місця першого її використання.
При оголошенні змінних можна не скупитися — оголошуйте стільки, скільки вам потрібно. Звичні методи оптимізації, які застосовувалися 20 років тому (наприклад, надмірна економія пам'яті — чим менше за змінні використовує програма, тим краще), за часів перших комп'ютерів, не спрацюють: ваша програма не працюватиме швидше, якщо ви будете в збиток власному комфорту використовувати одну змінну замість 5. До того ж можна наробити помилок, які дуже важко знайти.
Типи даних
Змінні в РНР можуть містити все, що завгодно — будь-яку інформацію. Виняток становлять тільки константи, які можуть містити тільки число або рядок.
Такого поняття як покажчик (це така змінна, яка містить не конкретне значення, а указує на область пам'яті, де знаходиться це значення), добре знайомого нам з мови C, взагалі не існує. При привласненні змінна копіюється «один в один», яку б структури вона не мала. Припустимо, що у нас є дві змінні - масив і рядок. Якщо ми першою змінною привласнимо значення другій, то наш масив буде назавжди втрачений, а змінна, яка містила масив, міститиме рядок — це і означає, що копіюється не тільки значення змінної, як в інших мовах, але і структура. Правда, починаючи з 4-ої версії, в PHP з'явилися жорсткі і м'які посилання, але про них ми поговоримо пізніше.
Розглянемо наступне оголошення змінних:
$а = 10;
$А = "Hello";
Як ви бачите, при оголошенні змінних ми не вказали їх тип. Вибір типу здійснюється самим інтерпретатором. Проте іноді PHP може помилитися і зіставити змінній неправильний тип. Тому потрібно задати тип явно. Про те, як це зробити, ми поговоримо трохи пізніше, а поки розглянемо основні типи змінних.
Типи змінних в PHP
Тип змінної
Опис

integer
Ціле число. Діапазон значень: від -2 147 483 648 до 2 147 483 647 (32 біта). Даний тип відповідає типу long int в мові С (longint - в Pascal)

double
(або float)
Дійсне число дуже великої точності

string
Рядок. Це дуже важливий тип, оскільки в більшості випадків сценарії займаються формуванням рядків.

array
Масив

object
Об’єкт. Мова РНР підтримує об’єкти. Доступ до елементів об’єкту відбувається за допомогою оператора ->

bool
Логічний тип даних. Змінні цього типу можуть приймати тільки одне з двох значень: true (істина) або false (брехня)

Функції визначення і завдання типу змінних
Мову PHP надає багато засобів для визначення типу змінних. Ви можете використовувати цілих сім функцій для визначення типу:
Is_int(Sx) або is_integer(Sx) — повертає true, якщо передана змінна — ціле число.
Is_double($x) або is_float(Sx) — повертає true, якщо передана змінна — дійсне число.
is_string(Sx) — повертає true, якщо передана змінна — рядок.
is_array(Sx) — повертає true, якщо передана змінна — масив.
is_object($x) — повертає true, якщо змінна є об'єктом.
is_bool(Sx) — повертає true, якщо змінна оголошена, як логічна.
gettype(Sx) — повертає рядки, відповідні типу змінної: integer, double, string, object, array, bool або unknown type, якщо неможливо визначити тип (коли тип змінної не будовується в PHP, а додається за допомогою модулів, що розширюють можливості мови).
Якщо PHP неправильно визначив тип змінної, можна вказати його явно. Для цього використовується функція settype(Sx, Stype), де $type — це один з рядків, що повертаються функцією gettype(). Наприклад:
settype($x,"double");
Функція повертає значення false, якщо неможливо привести тип змінної $х до вказаного типу $type.
Логічні змінні і їх особливості в PHP
Напевно, ви відмітили, що більшість функцій для визначення типу повертають логічне значення true або false (всі функції, окрім gettype()). Зараз самий час поговорити про логічні змінні і пов'язаних з ними «підводними каменями».
У PHP істиною є не будь-яке рівне нулю число, будь-який непорожній рядок, значення true. Значення false, порожній рядок, нуль — це брехня. Для того, щоб зрозуміти це проведемо ряд експериментів з логічними змінними. При цьому ми небагато забіжимо вперед і використовуватимемо умовного оператора If. Проте, якщо ви знайомі з якою-небудь алгоритмічною мовою (Сі, Паскаль і т.п), то без зусиль зрозумієте сенс оператора. Тим паче, що текст прикладів супроводжується докладними коментарями. Інакше ви можете повернутися до цього пункту пізніше.
Отже, створіть сценарій logical.php:
<? echo false; echo true; ?>
Перший оператор виводить порожній рядок, тобто нічого не виводить, а другою — виведе 1. Вище було сказано, що ненульове значення приймається, як істина.
У використанні логічних змінних в PHP є ще одна особливість. Якщо в операторах порівняння (= =, !=, <,") один тип є логічним, то і другий також сприймається, як логічний. Модифікуємо наш сценарій так:
<?
$х=10;
if ($х==1) echo " Змінна рівна l\n";
if ($x==true) echo "Змінна рівна True\n";
У першому рядку змінної $х було привласнено значення 10. Потім $х порівнюється з 1 і якщо $х рівне 1, то виводиться рядок «Змінна рівна 1». Потім значення змінної $х порівнюється із значенням True. І якщо $х рівне true, то виводиться рядок «Змінна рівна True». Виходячи з приведеного вище твердження, повинна бути виведеною тільки другий рядок. Так воно і відбувається.
Розглянемо ще один приклад:
<?
$х = 100;
$у = true;
echo "x= $х\ п";
echo "y= $у\ п";
if ($x==$y) echo "X=Y";
?>
Ось тут вже зовсім смішна ситуація: спочатку програма повідомляє, що X = 100, Y = 1, а потім, що X = Y.