Манипуляции с типами в PHP
http://belarusweb.net
Основы создания сайтов

Манипуляции с типами

Приведение типов в 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 для дальнейшего использования.

Примеры приведения типов

Код, содержащий операции приведения типа, представлен в примере 2.14.

<?php
$var_1=true; 					//Присвоили логическое значение true
$var_2=false; 					//Присвоили логическое значение false

$var_1=(integer) $var_1; 	//Теперь $var_1==1
$var_2=(integer) $var_2; 	//Теперь $var_2==0

$var_1=(string) $var_1; 	//Теперь $var_1=="1"
$var_2=(string) $var_2; 	//Теперь $var_2=="0"

//------------------------------------------------

$var_3="-1"; 					//Присвоили строку "-1"
$var_4=".9345E3"; 			//Присвоили строку ".9345E3"

$var_3=(bool) $var_3; 		//Теперь $var_3==1
$var_4=(integer) $var_4; 	//Теперь $var_4==0

//------------------------------------------------

$var_5="-.57"; 				//Присвоили строку "-.57"
$var_6=.9345E3; 				//Присвоили вещественное число, тоже 
									//самое, что и 934.5

$var_5=(array) $var_5; 		//Теперь $var_5==["-.57"]
$var_6=(array) $var_6; 		//Теперь $var_6==[934.5]
?>

Пример 2.14. Приведение типов переменных

Приведение к другим типам

Преобразование значений в тип resource не имеет смысла. Что касается приведения объектов к другим типам, а также преобразования значений разных типов в объект, то о них мы поговорим позже в соответствующем разделе.