PHP Manual

Змінні в PHP

22. 08. 2019

Obsah článku

Ця сторінка є повним описом того, як працюють змінні в PHP. Текст написаний дещо технічним стилем і може бути не зовсім зрозумілим для початківців. Якщо вас цікавлять повні основи, то прочитайте урок для початківців та принципи написання змінних.

Опис

Змінна - це віртуальна ділянка в оперативній пам'яті, яка визначається ім'ям та типом даних. У межах типу даних змінна тоді має деякий "вміст".

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

Написання прикладів:

$a = 10;
$b = 'кішка';
$c = true;

Кожен рядок у вибірці позначає визначення однієї змінної. Ім'я кожної змінної починається зі знаку долара $, за яким слідує саме ім'я. Знак рівності можна використовувати для присвоєння значення змінній.

Внутрішньо змінні зберігатимуться в пам'яті у вигляді хеш-таблиці:

Назва Тип Абревіатура Значення
ціле число ціле число ціле число ціле число ціле число ціле число ціле число ціле число ціле число ціле число ціле число ціле число ціле число ціле число
Коти.
boolean bool bool bool bool bool bool bool bool bool bool bool bool bool bool bool bool bool bool bool bool bool bool bool

Типи змінних

Змінні класифікуються відповідно до прав доступу та використання:

  • Не слід використовувати "глобальні змінні" та "змінні-змінні", оскільки вони сприяють нечитабельності коду та "магічній" (неочікуваній) поведінці програми.*.

Допустимий вміст змінних

Змінні можуть містити все, що дозволяє їх поточний тип даних. Якщо тип даних не вказано, то він буде визначений автоматично, виходячи зі змісту (це не рекомендується, оскільки може призвести до помилок).

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

Хорошим прикладом є, наприклад, додавання та множення чисел:

$x = 5; // ціле число
$y = 3; // ціле число
$z = $y + $y; // змінна $z буде складена на основі декількох змінних

У цьому випадку перед PHP постає питання, який тип даних буде мати новостворена змінна $z. Якщо вони мають однаковий тип даних і операція можлива, то тип даних успадковується.

Однак іноді ми можемо виконати операцію з декількома типами даних:

$x = 1; // ціле число
$y = 3.14159; // float
$z = $y + $y; // float

У цьому випадку ми об'єднуємо ціле та плаваюче значення. На виході буде десяткове число, тому використовується тип float. У цьому випадку PHP зробить щось, що називається динамічним перерозподілом.

Однак, ми не завжди можемо покладатися на таку поведінку. Наприклад, як би ви хотіли об'єднати число і рядок?

$x = 256; // ціле число
$y = 'Агов! Агов!'; // float
$z = $y + $y; // ???

Типи даних (огляд найважливіших)

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

Умовні позначення можуть мати такий вигляд:

$x = (int) 25; // створює змінну цілого типу

Огляд типів даних.

Успадкування типів даних

Який тип даних буде мати змінна $x, якщо ми знаємо тільки цей фрагмент коду?

$x = $y;

Це залежить від типу даних змінної $y, від якої буде успадковано як значення, так і його тип даних. У цьому випадку нам невідома змінна $x, тому ми не можемо продовжити обчислення коду і буде видано повідомлення про помилку.

Динамічне перевизначення

Нехай ми маємо наступні 2 змінні:

$x = 10;
$y = '10';

Яка різниця між вмістом змінних $x та $y?

Змінна $x - число, $y - рядок (містить "1" і "0"), тому якщо ми просто збережемо змінну в пам'яті і не будемо виконувати ніяких операцій, які вплинуть на її значення. Наприклад, наступні 2 записи повернуть однаковий результат:

echo $x + 5; // виводить 15
echo $y + 5; // виводить 15

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

Примітка: Важливо зазначити, що ми не можемо перетворювати типи даних повністю довільно, тому це не завжди можливо. Якщо перезаписати тип даних в якийсь інший (несумісний), то або перетворення може не відбутися взагалі, або вихідний вміст може бути зіпсований або повністю знищений і замінений на інший. Наприклад, якщо переписати рядок в ціле число (а в змінній зберігається деякий текст, що не є числом), то замість числового значення в змінній буде зберігатись значення 1.

Представлення рядків у вигляді масивів

Всі рядки зберігаються у внутрішній пам'яті у вигляді масиву символів. Тобто, кожен символ має свій індекс і на нього можна посилатися. Якщо ми не вказуємо індекс, то працює весь рядок.

$x = 'Програмуємо на PHP!';
$n = 3;
echo $x; // виводиться весь вміст змінної $x
echo $x[0]; // виводиться нульовий символ змінної $x
echo $x[$n]; // виводиться n-й символ змінної $x

Примітка: PHP нумерується з нуля, тобто нульовим символом є 'P', а першим символом - 'r'.

Крім того, символи переключаються по байтам. Наприклад, символ "ні" в кодуванні UTF-8 має довжину 2 байти, тому індекс символу в рядку не буде відповідати реальній позиції при прокручуванні і для зберігання символу буде використано 2 індекси.

Існування елементу масиву завжди слід перевіряти функцією isset():

if (isset($x[$n])) {
echo $x[$n];
}

Крім того, ви можете красиво записати це за допомогою тернарного оператора:

echo $x[$n] ?? '';

Копіювання змінних

Нехай маємо наступну змінну:

$q = 'Lorem ipsum, ...';

А потім скопіювати її значення в наступну змінну:

$qi = $q;

На щастя, ніякого копіювання не буде зроблено, і PHP просто збереже посилання на значення в хеш-таблиці. Значення буде фактично скопійовано лише тоді, коли значення однієї зі змінних має змінитися. Ця поведінка обробляється компонентом, який зазвичай називається Garbridge collector.

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
Status:
All systems normal.
2024