Приведение типов в PHP

Александр Кичатов

Что такое динамическая типизация

PHP - язык с динамической типизацией. Это значит, что тип переменной можно изменить в любой момент работы скрипта. В некоторых других языках типизация строгая, т.е. переменная может менять значение, но не тип.

Динамическая типизация - это удобная штука, но её следствие - неочевидность при работе с переменными разных типов. Рассмотрим пример:

<?php
    echo 2 * '11abc DEF 150';

Результатом работы скрипта будет 22. Странно, да? Не менее странно, чем этот код, который почему-то возвращает true:

<?php
	var_dump(1 == '1abc'); // bool(true)

Дело в том, что некоторые функции и операторы перед началом вычислений автоматически приводят значения к определённым типам. Например:

<?php
	// 10 - integer (целое число)
	$a = 10;

	// При умножении целого числа на дробное результат - дробное число
	$a = $a * 1.1;

	// На экран выведется double, т.е. дробное число
	echo gettype($a);

Итак, если мы умножаем целое число на дробное, то в результате мы получим дробное число, даже если у результата нет дробной части.

Приведение типов в PHP

Вы можете в любой момент привести переменную к другому типу:

<?php
	$var = 5;

	$var = (string) $var; // Теперь в переменной лежит строка '5'
	$var = (int) $var; // Теперь опять целое число
	$var = (float) $var; // Теперь дробь 5
	$var = (bool) $var; // Теперь true
?>

Арифметические операции со строками

Когда мы пытаемся совершить арифметическую операцию со строкой, PHP сначала приводит строку к числу.

И делает он это не совсем очевидным образом: число будет получено из первых числовых символов. Как только будет встречен первый нечисловой символ - остальная строка отбросится:

<?php
	echo '12abc' + 2;
	/*
		1. PHP пытается превратить '12abc' в число.
		2. В итоге '12abc' превратится в число 12
		3. Результатом вычислений будет 12 + 2 = 14
	*/
?>

Приведение к булеву типу

Когда вы пытаетесь привести значение к булеву типу, следующие значения приведутся к false:

  • 0 (целое или дробное)
  • '' (пустая строка)
  • '0' (строка с числом 0)
  • [] (пустой массив)
  • null

Все остальные значения приводятся к true.

Комментарии