Что такое динамическая типизация
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.