Как и в других языках, если операнды в выражениях (арифметических, сравнения или логических) имеют разные типы, они приводятся к одному типу.
Так, в арифметических выражениях все операнды преобразуются в числа, при этом, если хотя бы одно из чисел является числом с плавающей точкой, все операнды приводятся к виду с плавающей точкой (иначе все операнды представляются как целые числа).
В операциях отношения и логических операциях операнды приводятся к булевскому типу.
Так как PHP является языком со свободным объявлением типа, то в операторе присваивания переменная, стоящая слева приобретает тот же тип, что и тип выражения, стоящего справа.
В PHP можно использовать явное приведение типа (type casting), указав перед переменной или выражением имя типа, к которому надо привести эту переменную или выражение, в скобках.
Пример 4.6.44. Преобразование типов в выражении:
1. Неявное преобразование типа:
После выполнения оператора:
$a = 3 + 1.5;
переменная $a будет иметь значение 4.5 и тип float.
2. Явное преобразование типа:
|
|
$a = (int)(3 + 1.5);
После выполнения этого оператора переменная $a будет иметь значение 4 и тип int (integer).
При преобразовании переменных или выражений из одного типа в другой действуют следующие правила:
Преобразование в тип boolean (bool). При преобразовании в булевский тип следующие переменные рассматриваются как false: число 0 (типа integer), число 0.0 (типа float), пустая строка или строка "0" (типа string), массив с нулевым числом элементов (типа array), объект с нулевым количеством переменных (типа object) и значение NULL. Все остальные значения (включая все значения типа resource) рассматриваются как true.
Пример 4.6.45. Преобразование в булевский тип:
$a = ""; // $a определена как пустая строка
$a = (bool) $a; // $a получит значение false
$b = 12; // $b определена как целое число,
// не равное 0
$b = (bool) $b; // $b получит значение true
Преобразование строки в число. Строка преобразуется в вещественное число, если она содержит символы '.', 'e' или 'E', в противном случае она преобразуется в целое число. Если строка начинается с данных, которые могут интерпретироваться как число (целое или вещественное), то она преобразуется в это число, иначе строка преобразуется в целое число 0.
Пример 4.6.46. Преобразование строки в число:
// Строка преобразуется в целое число 12
$a = 1 + "12a"; // $a равно 13
// Строка преобразуется в вещественное число 1.2
$b = 5 + "12e-1a"; // $b равно 6.2
// Строка преобразуется в целое число 0
$c = 8 + "a12"; // $c равно 8
Преобразование в целое число. При преобразовании в целое число: булевские значения true и false преобразуются соответственно в 1 и 0, а вещественные числа округляются по нижней границе (целой части числа).
|
|
Если значение вещественного числа превышает диапазон, допустимый для целых чисел, то результат непредсказуем, причем никакого диагностического сообщения при этом не выдается.
Пример 4.6.47. Преобразование в целое число:
$a = true; // $a определено как булевское значение
$b = (int) $a; // $b – целое число со значением,
// равным 1
$c = 4.8; // $c определено как вещественное число
$d = (int) $c; // $d – целое число со значением,
// равным 4
Преобразование в вещественное число. При преобразовании булевских значений в вещественное число они сначала преобразуются в целые числа, а затем в вещественные 1.0 или 0.0. При преобразовании целого числа в вещественное возможны потеря точности и/или ошибки округления (поэтому к вещественным числам не рекомендуется применять операторы отношения "==" и "!=").
Пример 4.6.48. Преобразование в вещественное число:
$a = true; // $a определено как булевское значение
$b = (float) $a; // $b – вещественное число со значением,
// равным 1.0
$c = 4; // $c определено как целое число
$d = (float) $c; // $d – вещественное число со значением,
// равным 4.0
Преобразование в строку. Булевские значения true и false преобразуются соответственно в "1" и пустую строку "". Целые и вещественные числа преобразуются в свое строковое представление (включая степенную часть для вещественных чисел). Массивы и объекты преобразуются соответственно в строки "Array"и "Object". Ресурсы преобразуются в строку вида "Resource id #1", где 1 – уникальный идентификатор, который присваивается ресурсу во время выполнения. Значение NULL преобразуется в пустую строку.
Пример 4.6.49. Преобразование в строку:
$a = true; // $a определено как булевское значение
$b = (string) $a; // $b – строка со значением, равным "1"
$c = 4; // $c определено как целое число
$d = (string) $c; // $d – строка со значением, равным
$e = 4.5e-3; // $e определено как вещественное число
$f = (string) $e; // $f – строка со значением,
// равным "4.5E-3"
$g = array(1,2,3); // $g определено как массив
$h = (string) $g; // $f – строка со значением "Array",
Преобразование в массив. При преобразовании числа, строки, булевского значения или ресурса в массив создается массив с единственным элементом, имеющим индекс 0. При преобразовании объекта в массив значения переменных объекта становятся значениями элементов массива, а имена переменных – значениями ключей массива. При преобразовании значения NULL в массив создается массив с нулевым числом элементов.
Пример 4.6.50. Преобразование в массив:
$a = "String"; // $a определено как строка
$b = (array) $a; // Строка преобразуется в объект
$c = count($b); // $c – целое число со значением,
// равным 1
echo $b[0]; // Выведет 'String'
Ни один тип переменных не может быть преобразован в тип resource.