PHP :: Манипуляции с типами
Приведение типов в PHP
Поскольку PHP относится к языкам программирования с нестрогой типизацией данных, довольно часто получается так, что интерпретатор ожидает получить данные одного типа, а вместо этого получает данные другого типа. В таких случаях он просто осуществляет преобразование полученных данных к нужному типу.
Приведением типа называется процесс преобразования значения одного типа в значение другого типа.
Не смотря на то, что в большинстве случаев интерпретатор самостоятельно занимается приведением типов, у программиста также имеется возможность устанавливать и изменять тип переменной при помощи оператора приведения типа, который представляет собой имя типа в круглых скобках, записываемое перед переменной. В PHP применяются следующие операторы приведения типа:
- (bool), (boolen) – приведение к логическому типу;
- (int), (integer) – приведение к целочисленному типу;
- (float), (double), (real) – приведение к вещественному типу;
- (string) – приведение к строковому типу;
- (array) – приведение к типу array;
- (object) – приведение к типу object;
- (unset) – приведение к NULL.
В ходе приведения типов, во избежание непредвиденных результатов, следует знать правила, по которым происходит преобразование данных одного типа в другой. Перечислим их, после чего рассмотрим пример кода, содержащего данные преобразования типов.
Приведение к типу bool
Во время преобразования к типу bool следующие значения рассматриваются как FALSE:
- само значение false,
- 0 и 0.0,
- пустая строка "" и строка "0",
- массив без элементов (пустой массив) [],
- значение null,
- объект SimpleXML, созданный из пустых тегов.
Все остальные значения преобразуются в значение TRUE, включая значения типа resource, а также число -1, поскольку оно представляет собой обычное отрицательное число, отличное от нуля.
Приведение к типу integer
В случае привидения к типу integer:
- Логическое значение true преобразуется в 1, false – в 0.
- Значение null преобразуется в 0.
- Вещественные числа округляются вниз, т.е. в сторону нуля. Например, в случае приведения вещественного числа 7.9 к целочисленному типу оно будет преобразовано в число 7. При этом вещественное число не должно превышать максимально допустимые для целых чисел размеры (смотреть) иначе результат будет неопределенным, что вызвано отсутствием достаточной точности у вещественных чисел, чтобы вернуть верный результат. Более того, в данном случае не будет выведено даже замечания. Также не стоит приводить неизвестную дробь к целочисленному типу во избежание получения неожиданных результатов. Например, если привести к типу integer результат выражения (0.1+0.7)*10, то интерпретатор преобразует его в число 7, а не 8, как ожидалось.
- Если строка начинается с верной записи целого числа, то интерпретатор в процессе приведения строки к целочисленному типу вернет это число, отбросив всю остальную часть строки. Если же строка является пустой "" или начинается не с цифры, знака плюс + или знака минус -, она будет преобразована в число 0. Например, строка '-25 яблок' будет преобразована в число -25, строка '3.5 яблока' – в число 3, а строка 'Яблок было 25' – в число 0.
Для других типов данных приведение к целочисленному типу не определено, поэтому не стоит доверять текущему наблюдаемому поведению, так как оно может измениться без предупреждения.
Приведение к типу float
В случае привидения к типу float для всех типов, за исключением строк, сперва будет совершено преобразование в целочисленный тип, а уже потом целое число будет преобразовано в вещественное. Что касается строк, то:
- если строка начинается с верной записи вещественного числа (включая экспоненциальную форму записи), интерпретатор в процессе приведения строки к вещественному типу вернет это число, отбросив всю остальную часть строки;
- если же строка является пустой "" или начинается не с цифры, знака плюс +, знака минус - или символа точки . (напомним, что при записи вещественных чисел перед точкой ноль разрешается опускать), то она будет преобразована в число 0.
Например, строка '1.567e2 кг яблок' будет преобразована в число 156.7, строка '.5 яблока' – в число 0.5, а строка 'Было 2.5 кг яблок' – в число 0.
Приведение к типу string
В случае преобразования значений в строки (т.е. приведение к типу string):
- Логическое значение true преобразуется в строку "1", false – в пустую строку "".
- Целое или вещественное число преобразуется в строку, состоящую из самого числа. При этом учитывается и показатель степени вещественного числа. Например, число 1.567e2 будет преобразовано в строку '156.7', а число .5 – в строку '0.5'.
- Специальное значение null преобразуется в пустую строку "".
- Массивы всегда преобразуются в строку 'Array'.
- Ресурсы (данные типа resource) преобразуются в строку вида "Resource id #№", где № – номер ресурса во время выполнения.
Приведение к типу array
В случае преобразования значения типа bool, integer, float, string или resource в массив, результатом будет массив с этим элементом, индекс которого будет равен 0.
Приведение к типу NULL
Явное приведение переменной к специальному значению null с использованием конструкции (unset) $var не удаляет переменную и ее значение, а только возвращает значение null для дальнейшего использования.
Примеры приведения типов
Код, содержащий операции приведения типа, представлен в примере №1.
<?php //Присвоили логическое значение true $var_1=true; //Присвоили логическое значение false $var_2=false; //Теперь $var_1==1 $var_1=(integer) $var_1; //Теперь $var_2==0 $var_2=(integer) $var_2; //Теперь $var_1=="1" $var_1=(string) $var_1; //Теперь $var_2=="0" $var_2=(string) $var_2; //------------------------------------------------ //Присвоили строку "-1" $var_3="-1"; //Присвоили строку ".9345E3" $var_4=".9345E3"; //Теперь $var_3==1 $var_3=(bool) $var_3; //Теперь $var_4==0 $var_4=(integer) $var_4; //------------------------------------------------ //Присвоили строку "-.57" $var_5="-.57"; //Присвоили вещественное число, тоже самое, что и 934.5 $var_6=.9345E3; //Теперь $var_5==["-.57"] $var_5=(array) $var_5; //Теперь $var_6==[934.5] $var_6=(array) $var_6; ?>
Пример №1. Приведение типов переменных
Приведение к другим типам
Преобразование значений в тип resource не имеет смысла. Что касается приведения объектов к другим типам, а также преобразования значений разных типов в объект, то о них мы поговорим позже в соответствующем разделе.
Быстрый переход к другим страницам
- Значение NULL в PHP
- Манипуляции с типами в PHP
- Выражения и операторы в PHP
- Вернуться к оглавлению учебника