Типи
Zephir поєднує в собі статичну та динамічну типізацію. У цьому розділі ми розглянемо підтримувані типи даних та їхню поведінку.
Динамічні типи
Динамічних змінні працюють так само, як і в PHP. Їм можна призначати та перепризначати значення різних типів без обмежень.
Динамічна змінна має бути оголошеною з ключовим словом var
. Поведінка майже така сама, як і в PHP:
var a, b, c;
Ініціалізація змінних
let a = "hello", b = false;
Зміна їхнього значення
let a = "hello", b = false;
let a = 10, b = "140";
Виконання операцій
let c = a + b;
Вони можуть бути восьми типів:
Тип | Опис |
---|---|
array |
Масив — це впорядкована мапа. Мапа — це тип, який встановлює відповідність між значеннями та ключами. |
boolean |
Булевий тип виражає значення істини. Він може бути true або false . |
float /double |
Число з рухомою комою. Розмір числа залежить від платформи. |
integer |
Цілі числа. Розмір числа залежить від платформи. |
null |
Особливе значення NULL, яке означає змінну в якої немає значення. |
object |
Абстракція об’єкта як у PHP. |
resource |
Ресурс містить посилання на зовнішній ресурс. |
string |
Рядок є послідовністю символів, де кожен символ є одним байтом. |
Check more info about these types in the PHP manual.
Array
Реалізація масивів у Zephir в основному така сама як у PHP: впорядковані мапи оптимізовані для деяких випадків; можна розглядати як масив список (вектор) хеш-таблицю (реалізація мапи), словник, колекція, стек, черги. Можливі й інші трактування. Значеннями масиву можуть бути інші масиви, дерева, та багатовимірні масиви.
Синтаксис оголошення масиву дещо відрізняється від PHP:
Для оголошення повинні використовуватися квадратні дужки
let myArray = [1, 2, 3];
Для оголошення масиву з ключами повинна використовуватися двокрапка
let myHash = ["first": 1, "second": 2, "third": 3];
Ключами масиву можуть лише цілі числа та рядки:
let myHash = [0: "first", 1: true, 2: null];
let myHash = ["first": 7.0, "second": "some string", "third": false];
Boolean
Булевий тип виражає значення істини. Він може бути true
або false
:
var a = false, b = true;
Float/Double
Числа з рухомою комою (також відомі як “двійкові”, “числа з подвійною точністю”, “дійсні числа”). Літерали з рухомою комою - це вирази з однією або кількома цифрами, а потім - крапка (.), після нього одна або кілька цифр. Розмір числа після крапки залежить від платформи, хоча максимум ~1.8e308 з точністю приблизно 14 десяткових цифр мають загальне значення (64-бітний форматі IEEE).
var number = 5.0, b = 0.014;
Числа з рухомою комою мають обмежену точність. Хоча це залежить від системи, як і в PHP, Zephir використовує формат подвійної точності IEEE 754, який дасть максимальну відносну помилку через округлення порядку 1.11e-16.
Integer
Цілі числа. Розмір числа залежить від платформи, хоча максимальне значення для 32-бітного знакового числа є 2,147,483,647. 64-розрядні платформи зазвичай мають максимальне значення близько 9E18. PHP не підтримує цілі числа без знаку, тому Zephir теж має це обмеження:
var a = 5, b = 10050;
Програмне переповнення цілих чисел
На відміну від PHP Zephir автоматично не перевіряє рівень заповненості цілого числа. Як і в C, якщо ви виконуєте операції які можуть повернути велике число ви повинні використати такі типи як unsigned long
або ж float
:
unsigned long my_number = 2147483648;
Об’єкт
Zephir дозволяє створювати екземпляри PHP класів, маніпулювати PHP-об’єктами, викликати методи, читати константи класу та інші речі, які дозволяють PHP-об’єкти:
let myObject = new \stdClass(),
myObject->someProperty = "my value";
Рядок
Рядок string
є послідовністю символів, де кожен символ є одним байтом. Як і PHP, Zephir підтримує лише 256-символьний набір, а отже не дає вбудованої підтримки Unicode.
var today = "friday";
У Zephir рядкові літерали можна задавати лише взявши їх у подвійні лапки (як у C або Go). Одинарні лапки зарезервовані для типу даних char
.
У рядках підтримуються наступні символи екранування:
Послідовність | Опис |
---|---|
\t |
Горизонтальний відступ |
\n |
Переведення рядка |
\r |
Повернення каретки |
\\ |
Бекслеш |
\" |
Подвійні лапки |
var today = "\tfriday\n\r",
tomorrow = "\tsaturday";
Zephir не підтримує інтерполяцію змінних як це було в PHP; натомість ви повинні використовувати конкатенацію:
var name = "peter";
echo "hello: " . name;
Статичні типи
Статичні типи дозволяють розробнику оголосити та використовувати змінні з певними типами, які доступні у C. Змінна, яка оголошена з статичним типом не може змінювати свій тип. Проте, це дозволяє компілятору провести кращу оптимізацію. Підтримуються наступні типи даних:
Тип | Опис |
---|---|
array |
Структура, яка може бути використана як хеш, мапа, словник, колекція, стек, і т. д. |
boolean |
Булевий тип виражає значення істини. Він може бути true або false . |
char |
Найменша адресна одиниця машини, яка може містити символ з базового набору. |
float /double |
Тип з рухомою комою подвійної точності. Розмір числа залежить від платформи. |
integer |
Знакові числа. Розмір не менше 16 біт. |
long |
Довге знакове число. Розмір не менше 32 біт. |
string |
Рядок є послідовністю символів, де кожен символ є одним байтом. |
unsigned char |
Той же розмір, що і char , але гарантовано беззнаковий. |
unsigned integer |
Беззнакове ціле. Розмір не менше 16 біт. |
unsigned long |
Той же розмір, що й long , але беззнаковий. |
Boolean
Логічний тип boolean
виражає значення істини. Він може бути true
або false
. На відміну від поведінки динамічного типу статичні логічні типи залишаються логічними (true
or false
), не залежно від того, яке значення їм призначається:
boolean a;
let a = true;
автоматично перетворюється на true
let a = 100;
автоматично перетворюється на false
let a = 0;
кидає виняток компіляції
let a = "hello";
Char/Unsigned Char
Змінна типу char
найменша адресна одиниця машини, яка може містити символ з базового набору (як правило, 8 біт). Змінна типу char
може використовуватися для зберігання будь-яких символів у рядку:
char ch, string name = "peter";
зберігає “t”
let ch = name[2];
Літерали типу char
мають бути взяті в одинарні лапки
let ch = 'Z';
Integer/Unsigned Integer
значення типу integer
схожі з аналогами в динамічних типах. Значення, присвоєні цілим змінним, залишаються цілими:
int a;
let a = 50,
a = -70;
автоматично перетворюється на 100
let a = 100.25;
автоматично перетворюється на 0
let a = null;
автоматично перетворюється на 0
let a = false;
кидає виняток компіляції
let a = "hello";
Беззнакові цілі unsigned integer
схожі на цілі числа integer
, але вони не мають знака, це означає, що ви не можете зберігати від’ємні числа в таких змінних:
uint a;
let a = 50;
автоматично перетворюється на 70
let a = -70;
автоматично перетворюється на 100
let a = 100.25;
автоматично перетворюється на 0
let a = null;
автоматично перетворюється на 0
let a = false;
кидає виняток компіляції
let a = "hello";
Тип unsigned integer
вдвічі більший стандартного integer
. Присвоєння беззнакових цілих стандартним цілим (знаковим) може привести до втрати даних:
можлива втрата даних для b
uint a, int b;
let a = 2147483648,
b = a;
Long/Unsigned Long
змінні типу long
удвічі більші, аніж integer
, тому вони можуть зберігати великі числа. Як і у випадку з integer
, при присвоєнні значень змінним типу long
, вони автоматично приводитимуться до цього типу:
long a;
let a = 50,
a = -70;
автоматично перетворюється на 100
let a = 100.25;
автоматично перетворюється на 0
let a = null;
автоматично перетворюється на 0
let a = false;
кидає виняток компіляції
let a = "hello";
Тип unsigned long
схожий на long
, але не має знаку. Це означає, що ви не можете зберігати від’ємні числа в таких змінних:
ulong a;
let a = 50;
автоматично перетворюється на 70
let a = -70;
автоматично перетворюється на 100
let a = 100.25;
автоматично перетворюється на 0
let a = null;
автоматично перетворюється на 0
let a = false;
кидає виняток компіляції
let a = "hello";
Тип unsigned long
вдвічі більший стандартного long
; присвоювання даних типу unsigned long
стандартному знаковому long
може привести до втрати даних:
можлива втрата даних для b
ulong a, long b;
let a = 4294967296,
b = a;
String
Рядок є послідовністю символів, де кожен символ є одним байтом. Як і в PHP, цей тип даних підтримує лише 256-символьний набір, а отже, не має підтримки Юнікоду.
Коли змінна оголошується як string
вона ніколи не змінить свого типу:
string a;
let a = "";
рядкові літерали повинні бути взяті в подвійні лапки
let a = "hello";
перетворюється в рядок “A”
let a = 'A';
автоматично перетворюється на “”
let a = null;