Змінні і типи даних в PHP
Змінні є головним об’єктом практично будь-якої мови програмування. У загальному розумінні під терміном змінна розуміється іменована область пам’яті, в якій може зберігатися рядок, число, або складний об’єкт. Операції зі змінними здійснюються за допомогою їх імен.

Також зустрічаються і псевдотипи - умовні позначення одного або декількох типів. В основному вони використовуються спільно з функціями і методами. Наприклад, mixed - будь-який тип, number - може зберігати значення типу integer або double. Ключове слово void означає відсутність змінної. Кілька типів можуть бути розділені вертикальною лінією, що аналогічно логічній операції «або». Наприклад, псевдотип number можна записати, використовуючи наступну послідовність базових типів: integer | double.
Double | Float. Дійсне число, мінімально можливе значення якого становить від ± 2.23х10-308 ступеня до ± 1.79х10308.
Boolean. Логічний тип, здатний приймати лише два значення: True (істинне) і False (хибне).
String. Строковий тип. Може зберігати рядок, максимальний розмір якого становить 2 Гбайт.
Object. Об’єкт. Це конструкція, яка об’єднує кілька різнотипних змінних і методи їх обробки.
Resource. Дескриптор, що дозволяє оперувати тим чи інших ресурсом, доступ до якого здійснюється за допомогою бібліотечних функцій. Дескриптори застосовуються при роботі з файлами, базами даних, динамічними зображеннями тощо.
Null. Спеціальний тип, який сигналізує про те, що змінна не була ініціалізована.
Callable | Callback. Деякі функції РНР можуть приймати в якості аргументів інші функції, які називаються функціями зворотного виклику. Змінні даного типу містять посилання на такі функції.
Важливо також враховувати той факт, що в мові програмування PHP не буває переповнення - виходу значення за допустимі межі. Наприклад, якщо отримане значення не міститься в Integer, для нього автоматично вибирається більший тип даних Float:
При виведенні числа з плаваючою крапкою відводиться 12 символів, це значення може бути змінено за допомогою директиви Precision у конфігураційному файлі php.ini.
Оголошення дійсних чисел:
Подвійні лапки ("...") дозволяють замість змінних РНР підставляти їх значення. Така підстановка називається інтерполяцією.
Значення, укладене у зворотні лапки (`...`), сприймається як системна команда. Замість такої системної команди повертається результат виконання команди:
Застосування зворотного слеша з іншими символами інтерпретується особливим чином. Найчастіше використовуються символи переводу рядка (\n), повернення каретки (\r), символ табуляції (\t), зворотний слеш (\\), подвійна (\") та одинарна лапка (\'). Розміщення змінних та спеціальних символів (за винятком \') в одинарних лапках не призводить до їхньої спеціальної інтерпретації.
Хорошим тоном є вказівка меж змінної всередині рядка обрамленням фігурними дужками ({...}):
Маркер можна укладати в одинарні лапки, які повідомляють інтерпретатору РНР, що змінні всередині такого рядка не інтерполюються.
Крім того, чутливість РНР до помилок можна змінити, налаштувавши у конфігураційному файлі php.ini директиву Error_reporting або виконавши функцію Error_reporting. Однак не рекомендується використовувати придушення повідомлень про помилки при розробці програм, але в готових проектах краще відключати від користувачів виведення помилок, а адміністраторам дивитися їх у журналі.
Константа Null залежить від регістру. Однак, необхідно дотримуватися стандарту PSR-2 та записувати її у маленькими літерами.
Універсальною функцією, що дозволяє визначити тип змінної є функція Var_dump, яка виводить інформацію про змінну. Значення, що повертається, може приймати одне з значень: "boolean", "integer", "double", "string", "array", "object", "resource", "null" і "unknown type":
На відміну з інших мов програмування, де типи float і double мають різний розмір допустимих значень, у РНР з-поміж них немає відмінностей. Функція Var_dump повертає значення float для всіх дійсних чисел, незалежно від того, мають вони тип float або double:
Аналогічно число автоматично перетворюється на рядок там, де очікується рядкова змінна.
У логічний тип False автоматично приводяться всі значення рівні нулю "0", порожній рядок "", рядок, що містить "0", порожні масиви та об’єкти, а також null, решта змінних розглядаються як True.
Крім оператора круглих дужок РНР надає ряд спеціальних функцій, що дозволяють здійснити перетворення типу змінної. Функція Settype перетворює тип змінної на потрібний. Для цього в параметрах вказується назва змінної та новий тип даних, який може приймати одне з наступних значень: "boolean" або "bool", "integer" або "int", "float" або "double", "string", "array", "object", "null". Функція повертає True, якщо перетворення було успішно здійснено, і False інакше.
Ще один спосіб створення динамічних змінних полягає у використанні функції Eval. Вона приймає як параметр рядок з РНР-кодом і виконує його:
#самовчитель_php

Оголошення змінної
У мові програмування РНР всі змінні починаються зі знака долара ($), за яким може бути будь-яка кількість букв, цифр і символів підкреслення. Слід також зауважити, що перший символ не може бути цифрою, а імена змінних чутливі до регістру.$color = "Жовтий";
$Color = "Зелений";
echo $color; // Жовтий
echo $Color; // ЗеленийІніціалізувати змінну і привласнити їй значення можна за допомогою оператора присвоювання "=". Також допускається ініціалізація одним значенням відразу декільком змінних за рахунок того, що оператор присвоювання повертає результат присвоєння. наприклад:$color = $Color = "Жовтий";
echo $color; // Жовтий
echo $Color; // ЖовтийТипи даних
На відміну від більшості інших мов програмування, типізація даних РНР є доволі слабкою, що в свою чергу дозволяє не вимагати суворого визначення типу змінних при їх оголошенні. У ході виконання програми тип змінної може бути змінений неявним чином без спеціальних перетворень, що дозволяє розробнику практично не замислюватися про типи даних.Також зустрічаються і псевдотипи - умовні позначення одного або декількох типів. В основному вони використовуються спільно з функціями і методами. Наприклад, mixed - будь-який тип, number - може зберігати значення типу integer або double. Ключове слово void означає відсутність змінної. Кілька типів можуть бути розділені вертикальною лінією, що аналогічно логічній операції «або». Наприклад, псевдотип number можна записати, використовуючи наступну послідовність базових типів: integer | double.
Основні типи даних, які підтримуються РНР:
Integer. Ціле число, максимальне значення якого залежить від розрядності операційної системи. У разі 32-бітної операційної системи число може приймати значення від -2 147 483 648 до 2 147 483 647. Якщо розрядність становить 64 біта, діапазон можливих значень від -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807.Double | Float. Дійсне число, мінімально можливе значення якого становить від ± 2.23х10-308 ступеня до ± 1.79х10308.
Boolean. Логічний тип, здатний приймати лише два значення: True (істинне) і False (хибне).
String. Строковий тип. Може зберігати рядок, максимальний розмір якого становить 2 Гбайт.
У 32-бітних системах і PHP версій менше 7, рядки не можуть бути більшими за 2 Гб (2147483647 байт). У PHP 7.0.0, на 64-бітних платформах немає будь-яких досяжних обмежень для довжини рядка.
Array. Масив. Це об’єднання декількох змінних під одним ім’ям, звертання до яких відбувається за допомогою індексу масиву.Object. Об’єкт. Це конструкція, яка об’єднує кілька різнотипних змінних і методи їх обробки.
Resource. Дескриптор, що дозволяє оперувати тим чи інших ресурсом, доступ до якого здійснюється за допомогою бібліотечних функцій. Дескриптори застосовуються при роботі з файлами, базами даних, динамічними зображеннями тощо.
Null. Спеціальний тип, який сигналізує про те, що змінна не була ініціалізована.
Callable | Callback. Деякі функції РНР можуть приймати в якості аргументів інші функції, які називаються функціями зворотного виклику. Змінні даного типу містять посилання на такі функції.
Цілі числа
Оскільки більшість прикладних задач носить виключно арифметичний характер, найбільш поширеними в програмуванні є цілі числа. Крім того, операції з ними виконуються найшвидше.Важливо також враховувати той факт, що в мові програмування PHP не буває переповнення - виходу значення за допустимі межі. Наприклад, якщо отримане значення не міститься в Integer, для нього автоматично вибирається більший тип даних Float:
var_dump(9223372036854775807); // int(9223372036854775807)
var_dump(9223372036854775808); // float(9.223372036854776E+18)Оголошення цілочисельних змінних може здійснюватися кількома способами:$num = 123; // десяткове число
$num = +123; // десяткове число
$num = -123; // від’ємне число
$num = 012; // вісімкове число (еквівалентно 10)
$num = 0xA; // шістнадцяткове число (еквівалентно 10)Додатне ціле число оголошується без вказівки перед ним знака плюс. Для оголошення від’ємного числа необхідно перед ним вказати символ мінуса. За замовчуванням числа задаються в десятковій системі числення, однак в РНР можна оголошувати змінні в вісімковій і шістнадцятковій системах числення. Більш докладно про цілі числа і системи числення можна дізнатися зі статті Типи даних в PHP: Цілі числа.Дійсні числа (числа з плаваючою крапкою)
Дійсні числа (Float чи Double) мають дуже великий інтервал, вийти який практично неможливо. Існують дві форми запису дійсного числа: стандартна та експоненційна.При виведенні числа з плаваючою крапкою відводиться 12 символів, це значення може бути змінено за допомогою директиви Precision у конфігураційному файлі php.ini.
Оголошення дійсних чисел:
<?php
// Стандартний запис
$var = 1.23456;
// Експонентний запис
$var = 1.23456E2; // 123.456Докладніше про дійсні числа можна дізнатися зі статті Числа з плаваючою крапкою (Float).Логічний тип
Змінні логічного типу Boolean приймають лише два значення: True (істина) або False (брехня). Константи True і False не залежать від регістру, але за стандартами написання коду PSR-2, рекомендується писати малими літерами: true і false. Найчастіше змінні логічного типу застосовуються разом із операторами порівняння і циклу. Докладніше про логічний тип можна дізнатися із статті Двійкові числа (boolean).Рядки
Рядки призначені для зберігання текстової інформації. Як зазначалося вище, у 32-бітних системах і PHP версій менше 7, рядки не можуть бути більшими за 2 Гб (2147483647 байт). У PHP 7.0.0, на 64-бітних платформах немає будь-яких досяжних обмежень для довжини рядка. На максимальний об’єм рядка також впливає обмеження об’єму пам’яті, що відводиться під РНР-скрипт. Обсяг пам’яті визначається директивою Memory_limit конфігураційного файлу php.ini. Оголошення рядків здійснюється за допомогою лапок:<?php
$str = "Hello, World!";Лапки
Рядки та рядкові змінні створюються шляхом укладання тієї чи іншої фрази в лапки. У РНР є можливість використовувати кілька типів лапок, кожен вид яких має власні особливості.Подвійні лапки ("...") дозволяють замість змінних РНР підставляти їх значення. Така підстановка називається інтерполяцією.
<?php
$str = "Hello, world!";
echo "Значення змінної - $str"; // Значення змінної – Hello, world!Одиночні лапки ('...') не дозволяють підставляти значення змінних.Значення, укладене у зворотні лапки (`...`), сприймається як системна команда. Замість такої системної команди повертається результат виконання команди:
<?php
echo `dir`;
// Volume in drive C has no label.
// Volume Serial Number is FE44-B92A
// Directory of C:\localhost\mysite
// 30.05.2019 15:47 <DIR> .
// 30.05.2019 15:47 <DIR> ..
// 23.05.2019 12:27 13 753 .htaccess
// 31.05.2019 15:11 1 083 index.phpУ мовах програмування, зазвичай, підтримуються два варіанти лапок: одинарні і подвійні, щоб при необхідності застосовувати одинарні лапки для обрамлення подвійних, а подвійні - для обрамлення одинарних. Більш детально можна дізнатися зі статті Різниця між подвійними та одинарними лапками у PHP.<?php
echo "Змінна набуває значення 'abc'";
echo 'Самовчитель "PHP"';Іноді під час використання подвійних лапок необхідно придушити підстановку значень змінної. Для цього застосовується екранування символу $ зворотним слешем \.<?php
$str = "Hello, world!";
echo "Значення змінної - \$str"; // Значення змінної - $strАналогічно екранування застосовується і для розміщення подвійних лапок у рядку, обрамленому подвійними лапками.Застосування зворотного слеша з іншими символами інтерпретується особливим чином. Найчастіше використовуються символи переводу рядка (\n), повернення каретки (\r), символ табуляції (\t), зворотний слеш (\\), подвійна (\") та одинарна лапка (\'). Розміщення змінних та спеціальних символів (за винятком \') в одинарних лапках не призводить до їхньої спеціальної інтерпретації.
Хорошим тоном є вказівка меж змінної всередині рядка обрамленням фігурними дужками ({...}):
<?php
$str = "Hello, world!";
echo "Значення змінної - {$str}"; // Значення змінної - Hello, world!Оператор <<<
Оголосити рядок можна також за допомогою оператора <<<, який ще називають вбудованим документом (hеrе-документ). Відразу після цієї послідовності розміщується мітка, кінець оператора позначається повторним входженням мітки. Мітка залежить від регістру, але зазвичай вводиться за допомогою великих букв.<?php
$str = <<< EOT
Доки не зустрінеться
мітка, можна писати все що завгодно
EOT;
echo $str;Після першої мітки EOT не повинно бути пробілів, лише перевод рядка, як, втім, і перед останньою міткою EOT. Послідовність <<< зазвичай застосовують для введення об’ємного тексту, який незручно вводити за допомогою традиційних лапок.Маркер можна укладати в одинарні лапки, які повідомляють інтерпретатору РНР, що змінні всередині такого рядка не інтерполюються.
<?php
$str = "Hello, world!";
$str = <<< 'EOT'
Доки не зустрінеться
мітка, можна писати все що завгодно $str
EOT;
echo $str;Результат виконання:Доки не зустрінеться
мітка, можна писати все що завгодно $strНеініціалізовані змінні
У мові програмування РНР змінна створюється відразу ж при першому зверненні. Якщо вона не була ініціалізована за допомогою оператора присвоєння =, генерується зауваження (Notice):<?php
echo $city;
// Notice: Undefined variable: city in test.php on line 2В результаті звернення до неініціалізованої змінної генерується зауваження про невизначену змінну.Крім того, чутливість РНР до помилок можна змінити, налаштувавши у конфігураційному файлі php.ini директиву Error_reporting або виконавши функцію Error_reporting. Однак не рекомендується використовувати придушення повідомлень про помилки при розробці програм, але в готових проектах краще відключати від користувачів виведення помилок, а адміністраторам дивитися їх у журналі.
Спеціальний тип Null
Для позначки неініціалізованої змінної призначений спеціальний тип Null. Змінна також отримує цей тип, якщо вона ініціалізується константою типу Null або знищується за допомогою конструкції Unset.Константа Null залежить від регістру. Однак, необхідно дотримуватися стандарту PSR-2 та записувати її у маленькими літерами.
<?php
$city = null;Слід зазначити, що з ініціалізації змінної з допомогою константи null і подальшому зверненні до змінної у висловлюваннях генерації зауваження "Notice: Undefined variable" немає.Знищення змінної
Для знищення змінної можна користуватися конструкцією Unset. У параметрах конструкції вказується або одна, або кілька розділених комами змінних, які підлягають знищенню. Після виклику даної конструкції пам’ять, виділена під значення змінної, повертається системі, а самій змінній надається значення null.<?php
// Оголошуємо змінну
$city = "Kiev";
// Знищуємо
unset($city);
// Спроба звернення до неіснуючої змінної
echo $city; // Генерируется "Notice: Undefined variable"Знищення непотрібних змінних може бути корисним, коли скрипт оперує об’ємними даними (наприклад, вмістом файлів), і їх розмір загрожує перевищити обсяг пам’яті, що виділяється скрипту.Перевірка існування змінної
Для перевірки існування змінної використовується конструкція Isset, в параметрах якої вказується або одна, або кілька розділених комами змінних. На відміну від конструкції Unset тут повертається значення логічного типу. Якщо всі змінні існують, конструкція повертає True, якщо хоча б одна змінна не існує – повертається False.<?php
// Оголошуємо порожню змінну
$str = '';
if (isset($str)) { // true
echo 'Змінна $str існує';
}
// Позначаємо змінну $str як неініціалізовану
$str = null;
if (isset($str)) { // false
echo 'Змінна $str існує';
}Як видно з прикладу, порожній рядок не еквівалентний неініціалізованій змінній. Для перевірки, чи є рядок порожнім чи ні, призначена спеціальна конструкція Empty, яка приймає як параметр лише одну змінну і повертає True, якщо змінна дорівнює порожньому рядку "", нулю 0, символу нуля в рядку "0", null, false, порожньому масиву array(), неініціалізованій змінній. У решті випадків повертається False.Визначення типу змінної
PHP дозволяє визначити, якого типу належить змінна. Це корисно, враховуючи, що деякі функції (особливо функції для роботи з масивами та об’єктами) вкрай чутливі до типу даних.Універсальною функцією, що дозволяє визначити тип змінної є функція Var_dump, яка виводить інформацію про змінну. Значення, що повертається, може приймати одне з значень: "boolean", "integer", "double", "string", "array", "object", "resource", "null" і "unknown type":
<?php
// Оголошуємо цілу змінну:
$number = 123;
echo var_dump($number); // int(123)
// Оголошуємо логічну змінну:
$flag = true;
echo var_dump($flag); // bool(true)
// Оголошуємо рядкову змінну:
$str = '';
echo var_dump($str); // string(0) ""
// Оголошуємо дійсну змінну:
$var = 1.7;
echo var_dump($var); // float(1.7)
// Знищуємо змінну $var:
unset($var);
echo var_dump($var); // Notice: Undefined variable (null)Для кожного з типів призначена функція, що починається з префікса is_, яка повертає True, якщо змінна належить заданому типу. Наприклад, функція Is_int перевіряє, чи є змінна цілого типу Integer:<?php
// Оголошуємо цілу змінну
$number = 12345;
if (is_int($number)) { // true
echo 'Змінна $number є цілим числом';
}
// Оголошуємо рядкову змінну
$str = '12345';
if (is_int($str)) { // false
echo 'Змінна $str є цілим числом';
}Результат роботи прикладу є вивід одного рядка, оскільки тільки $number є цілою змінною. Змінна $str, незважаючи на те, що містить число, містить рядковий тип, тому функція Is_int повертає для неї False.На відміну з інших мов програмування, де типи float і double мають різний розмір допустимих значень, у РНР з-поміж них немає відмінностей. Функція Var_dump повертає значення float для всіх дійсних чисел, незалежно від того, мають вони тип float або double:
<?php
$float = 123.24;
var_dump($float); // float(123.24)
$double = 123.24e307; // float(INF)
var_dump($double);Неявне приведення типів
У мовах програмування, яким властивий серйозний підхід до типізації даних, при оголошенні змінної слід обов’язково вказувати її тип, інакше програма призведе до помилки. PHP відноситься до слабо типізованих мов, тому від програміста не вимагається явна вказівка типу змінної, а спроба використання її в контексті, де очікується змінна іншого типу, призведе до спроб автоматичного (неявного) перетворення змінної до потрібного типу. Наприклад, якщо рядок містить число і використовується в арифметичному вираженні, то він автоматично буде приведений до числового типу:<?php
$str = '36.6';
$number = 1 + $str;
echo $number; // 37.6Інтерпретатор РНР отримує з початку рядка найбільш повне значення, що відповідає числу. Якщо витягти число з рядка не вдається, його значення розглядається як нульове:<?php
echo '12abc23' + 1; // 12 + 1 = 13
echo 1 + 'два'; // 1 + 0 = 1Цей код виконається з приміткою "Notice: A non well formed numeric value encountered", яке попереджає, що виявлено неправильно сформоване числове значення.Аналогічно число автоматично перетворюється на рядок там, де очікується рядкова змінна.
У логічний тип False автоматично приводяться всі значення рівні нулю "0", порожній рядок "", рядок, що містить "0", порожні масиви та об’єкти, а також null, решта змінних розглядаються як True.
<?php
$int = 0;
if ($int) { // false
echo 'Змінна $int розглядається як true';
}
$str = "Hello, World!";
if ($str) { // true
echo 'Змінна $str розглядається як true';
}При перетворенні логічного типу до рядка, True перетворюється на "1", а False на порожній рядок "". Перетворення логічного типу до числа призводить до перетворення True на 1, а False на 0. Тому True завжди виводиться як одиниця, а False як порожній рядок.Явне приведення типів
У РНР можна явно перетворити змінну на один із підтримуваних типів. Одним із варіантів перетворення полягає використання круглих дужок. У них вказується тип, до якого якого слід привести змінну.<?php
$float = 1.23; // float(1.23)
$number = (int)$float; // int(1)Наведемо всі можливі варіанти використання оператора круглих дужок: (int|integer) – приведення до цілого типу int; (bool|boolean) – приведення до логічного типу boolean; (float|double|real) - приведення до дійсного типу double; (string) – приведення до рядкового типу string; (array) – приведення до масиву; (object) – приведення до об’єкта.Крім оператора круглих дужок РНР надає ряд спеціальних функцій, що дозволяють здійснити перетворення типу змінної. Функція Settype перетворює тип змінної на потрібний. Для цього в параметрах вказується назва змінної та новий тип даних, який може приймати одне з наступних значень: "boolean" або "bool", "integer" або "int", "float" або "double", "string", "array", "object", "null". Функція повертає True, якщо перетворення було успішно здійснено, і False інакше.
<?php
// Оголошуємо рядкову змінну
$str = '5abc';
// Змінюємо рядок на ціле число
settype($str, 'integer'); // int(5) Функція Settype повертає логічне значення, а не результат перетворення. Насправді, якщо у явному перетворенні виникає потреба, набагато зручніше користуватися спеціалізованими функціями: Floatval, Intval і Strval.Динамічні змінні
У PHP можна створювати змінні довільного типу, для цього необхідно використовувати подвійний символ $$. Іноді назву змінної неможливо визначити заздалегідь, і вона має визначатися у міру виконання скрипта. В цьому випадку вдаються до динамічних змінних.<?php
$id_menu = 10;
$str = "active$id_menu"; // "active10"
$$str = 1; // $active10 = 1;
if (isset($active10)) {
echo "Змінна \${$str} існує і дорівнює $active10";
}Значення змінної, що настає після першого знака $, сприймається як ім’я нової змінної. Якщо рядок $str має значення "active10", ім’я нової змінної буде $active10.Ще один спосіб створення динамічних змінних полягає у використанні функції Eval. Вона приймає як параметр рядок з РНР-кодом і виконує його:
<?php
$str = '$num = "10";
echo $num;';
eval($str); // 10В результаті виконання скрипта з лістингу у вікно браузера буде виведено число 10. Таким чином, змінна $num, яка визначена в рядку $str, доступна не тільки в межах цього рядка, але і після виконання функції Eval.Посилання на змінні
Для створення посилань використовується оператор &:<?php
$first = 5;
$second = &$first;
$second = 1;
echo $first; // 1Як видно з прикладу, якщо перед ім’ям змінної використовувати оператор &, то інша змінна стає посиланням. Обидві назви змінних виступають як синоніми.#самовчитель_php
