007 Типы
Zephir динамически и статически типизируется. В этой главе мы выделим поддерживаемые типы и их поведение:
Динамический тип
Динамические переменные точно так, как в PHP, они могут быть назначены и переназначены в различные типы без ограничений.
Динамическая переменная должна быть объявлена с помощью служебного слова ‘var’, поведение с ней идентична как и PHP:
var a, b, c; // Инициализировать переменные let a = "hello", b = false; // Change their values let a = 10, b = "140"; // Выполнять операции между ними let c = a + b;
Всего существует 8 типов:
Тип | Описание |
boolean | Логическое выражение выражает истинное значение. Он может быть ‘true’ или ‘false’. |
integer | Целые числа. Размер целого числа зависит от платформы. |
float/double | Числа с плавающей запятой. Размер зависит от платформы. |
string | Строка представляет собой последовательность символов, где символ совпадает с байтом. |
array | Массив - это упорядоченная карта. Карта - это тип, который связывает значения с ключами |
object | Абстракция объекта, как в PHP |
resource | Ресурс содержит ссылку на внешний ресурс |
null | Специальное значение NULL представляет переменную без значения |
Подробнее об этих типах можно узнать в PHP manual
Boolean
Логическое выражение выражает истинное значение. Он может быть ‘true’ или ‘false’:
var a = false, b = true;
Integer
Целые числа. Размер целого числа зависит от платформы, хотя максимальное значение около двух миллиардов является обычным значением (это 32 бита, подписанного). 64-битные платформы обычно имеют максимальное значение около 9E18. PHP не поддерживает целые числа без знака, поэтому у Zephir есть это ограничение тоже:
var a = 5, b = 10050;
Целочисленное переполнение
В отличие от PHP, Zephir не проверяет автоматически переполнение целочисленного типа, как в C, если вы выполняете операции, которые могут возвращать большое число, вы можете использовать такие типы, как «unsigned long» или «float» для их хранения:
unsigned long my_number = 2147483648;
Float/Double
Числа с плавающей запятой (также известные как “floats”, “doubles”, или “real numbers”). Литералы с плавающей запятой представляют собой выражения из нуля или более цифр, за которыми следует точка (.), За которой следуют ноль или более цифр. Размер float зависит от платформы, хотя максимум ~ 1.8e308 с точностью примерно 14 десятичных цифр является общим значением (64-битный формат IEEE).
var number = 5.0, b = 0.014;
Числа с плавающей запятой имеют ограниченную точность. Хотя это зависит от системы, как PHP, Zephir использует формат двойной точности IEEE 754, который даст максимальную относительную ошибку из-за округления порядка 1.11e-16.
String
Строка представляет собой последовательность символов, где символ совпадает с байтом. Как PHP, Zephir поддерживает только 256-символьный набор и, следовательно, не предлагает поддержку Unicode.
var today = "friday";
В Zephir строковые литералы могут указываться только с помощью двойных кавычек (как в C), одинарные кавычки зарезервированы для символов.
В строках поддерживаются следующие escape-последовательности:
Последовательность | Описание |
\t | Горизонтальная табуляция |
\n | Перевод строки |
\r | Возврат каретки |
\ \ | Обратная косая черта |
\” | Двойная кавычка |
var today = "\tfriday\n\r", tomorrow = "\tsaturday";
В Zephir строки не поддерживают парсинг переменных, как в PHP, вместо этого вы можете использовать конкатенацию:
var name = "peter"; echo "hello: " . name;
Arrays
Реализация массива в Zephir в основном такая же, как и в PHP: упорядоченные карты, оптимизированные для различных целей; Его можно рассматривать как массив, список (вектор), хэш-таблицу (реализацию карты), словарь, коллекцию, стек, очередь и, возможно, больше. В качестве значений массива могут выступать другие массивы, деревья и многомерные массивы также возможны.
Синтаксис для определения массивов немного отличается от PHP:
//Квадратные фигурные скобки должны использоваться для определения массивов let myArray = [1, 2, 3]; //Двойной двоеточие необходимо использовать для определения ключей хэшей let myHash = ["first": 1, "second": 2, "third": 3];
В качестве ключей могут использоваться только long и string значения:
let myHash = [0: "first", 1: true, 2: null]; let myHash = ["first": 7.0, "second": "some string", "third": false];
Objects
Zephir позволяет создавать экземпляры, манипулировать, вызывать методы, читать константы классов и т.д. Из объектов PHP:
let myObject = new stdClass(), myObject->someProperty = "my value";
Статические типы
Статическая типизация позволяет разработчику объявлять и использовать некоторые типы переменных, доступные в C. Переменные не могут изменить их тип, как только они объявлены как динамические типы. Тем не менее, они позволяют компилятору делать лучшую оптимизационную работу. Поддерживаются следующие типы:
Тип | Описание |
boolean | Логическое выражение. Оно может быть либо ‘true’ или ‘false’. |
integer | Целые числа со знаком. Минимум 16 бит. |
unsigned integer | Целочисленные без знака. Минимум 16 бит. |
char | Наименьшая адресная единица машины, которая может содержать базовый символ. |
unsigned char | Тот же размер, что и char, но гарантированно без знака. |
long | Длинное целое со знаком. Минимум 32 бита. |
unsigned long | То же, что и long, но без знака. |
float/double | Тип с плавающей запятой двойной точности. Размер зависит от платформы. |
string | Строка представляет собой последовательность символов, где символ совпадает с байтом. |
array | Структура, которая может использоваться в качестве хеша, карты, словаря, коллекции, стека и т. д. |
Boolean
Логическое выражение выражает истинное значение. Он может быть ‘true’ или ‘false’. В отличие от динамического поведения статические логические типы остаются логическими (true или false), а не тем значением, что им присваевается:
boolean a; let a = true, a = 100, // автоматически переводится в true a = null, // автоматически переводится в false a = "hello"; // выдает исключение компилятора
Integer/Unsigned Integer
Целочисленные значения подобны целочисленному элементу в динамических значениях. Значения, присвоенные целым переменным, остаются целыми:
int a; let a = 50, a = -70, a = 100.25, // автоматически переводится в 100 a = null, // автоматически переводится в 0 a = false, // автоматически переводится в 0 a = "hello"; // выдает исключение компилятора
Целые числа без знака подобны целым числам, но они не имеют знака, это означает, что вы не можете хранить отрицательные числа в таких переменных:
uint a; let a = 50, a = -70, // автоматически переводится в 70 a = 100.25, // автоматически переводится в 100 a = null, // автоматически переводится в 0 a = false, // автоматически переводится в 0 a = "hello"; // выдает исключение компилятора
Целые числа без знака в два раза больше стандартных целых чисел, присваивать целые числа без знака целым может означать потерю данных:
uint a, int b; let a = 2147483648, b = a, // возможная потеря данных
Long/Unsigned Long
Long переменные в два раза больше, чем integer переменные, поэтому они могут хранить большие числа. В качестве значений целых чисел, назначенных длинным переменным, автоматически присваивается этот тип:
long a; let a = 50, a = -70, a = 100.25, // автоматически переводится в 100 a = null, // автоматически переводится в 0 a = false, // автоматически переводится в 0 a = "hello"; // выдает исключение компилятора
Unsigned long похожи на long, но они не имеют знака, это означает, что вы не можете хранить отрицательные числа в таких переменных:
ulong a; let a = 50, a = -70, // автоматически переводится в 70 a = 100.25, // aавтоматически переводится в 100 a = null, // автоматически переводится в 0 a = false, // автоматически переводится в 0 a = "hello"; // выдает исключение компилятора
Unsigned longs в два раза больше, чем стандартные longs, назначить unsigned longs longs может означать потерю данных:
ulong a, long b; let a = 4294967296, b = a, // возможная потеря данных
Char/Unsigned Char
Переменная Char - наименьшая адресуемая единица машины, которая может содержать базовый символ из набора. Каждая переменная ‘char’ представляет один символ в строке:
char ch, string name = "peter"; let ch = name[2]; // сохраняет 't' let ch = 'Z'; // литералы char должны быть заключены в простые кавычки
String
Строка представляет собой последовательность символов, где символ совпадает с байтом. Как и в PHP, он поддерживает только 256-символьный набор и, следовательно, не поддерживает использование Юникода.
Когда переменная объявлена как строка, она никогда не меняет тип:
string a; let a = "", a = "hello", // строковые литералы должны быть заключены в двойные кавычки a = 'A', // преобразуется в строку "A" a = null; // автоматически переводится в ""