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 не требует (и не поддерживает) явного типа при определении переменной; тип переменной определяется по контексту, в котором она используется. То есть, если вы присвоите значение типа string переменной $var , то $var станет строкой. Если вы затем присвоите $var целочисленное значение, она станет целым числом.
Примером автоматического преобразования типа является оператор сложения ‘+’. Если какой-либо из операндов является float , то все операнды интерпретируются как float , и результатом также будет float . В противном случае операнды будут интерпретироваться как целые числа и результат также будет целочисленным. Обратите внимание, что это НЕ меняет типы самих операндов; меняется только то, как они вычисляются и сам тип выражения.
$foo = «0» ; // $foo это строка (ASCII 48)
$foo += 2 ; // $foo теперь целое число (2)
$foo = $foo + 1.3 ; // $foo теперь число с плавающей точкой (3.3)
$foo = 5 + «10 Little Piggies» ; // $foo это целое число (15)
$foo = 5 + «10 Small Pigs» ; // $foo это целое число (15)
?>?php
Если последние два примера вам непонятны, смотрите Преобразование строк в числа.
Если вы хотите, чтобы переменная принудительно вычислялась как определенный тип, смотрите раздел приведение типов. Если вы хотите изменить тип переменной, смотрите settype() .
Если вы хотите протестировать любой из примеров, приведенных в данном разделе, вы можете использовать функцию var_dump() .
Замечание:
Поведение автоматического преобразования в массив в настоящий момент не определено.
К тому же, так как PHP поддерживает индексирование в строках аналогично смещениям элементов массивов, следующий пример будет верен для всех версий PHP:
Приведение типов
Приведение типов в PHP работает так же, как и в C: имя требуемого типа записывается в круглых скобках перед приводимой переменной.
Допускаются следующие приведения типов:
- (int), (integer) — приведение к integer
- (bool), (boolean) — приведение к boolean
- (float), (double), (real) — приведение к float
- (string) — приведение к string
- (array) — приведение к array
- (object) — приведение к object
- (unset) — приведение к NULL (PHP 5)
Приведение типа (binary) и поддержка префикса b были добавлены в PHP 5.2.1
Обратите внимание, что внутри скобок допускаются пробелы и символы табуляции, поэтому следующие примеры равносильны по своему действию:
Приведение строковых литералов и переменных к бинарным строкам:
Замечание:
Вместо использования приведения переменной к string , можно также заключить ее в двойные кавычки.
$foo = 10 ; // $foo — это целое число
$str = » $foo » ; // $str — это строка
$fst = (string) $foo ; // $fst — это тоже строка
?php
// Это напечатает «они одинаковы»
if ( $fst === $str ) echo «они одинаковы» ;
>
?>
Может быть не совсем ясно, что именно происходит при приведении между типами. Для дополнительной информации смотрите разделы: