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

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

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

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

echo 2 * '11abc DEF 150';

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

var_dump(1 == '1abc'); // bool(true)

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

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

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

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

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

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

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

$var = 5;

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

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

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

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

echo '12abc' + 2;

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

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

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

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

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

Написать комментарий