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; // автоматически переводится в ""

Содержание.

Предыдушая Следующая