Манипуляции с типами
PHP не требует явного определения типа при объявлении переменной.
Если тип переменной не указан, он будет определён значением, которое она хранит.
То есть, если переменной $var присваивается значение типа строка (string), то
$var изменит тип на строку (string).
Если после этого переменной $var будет присвоено значение типа целое число (int), то она изменит тип на целое число (int).
В ряде контекстов PHP может попытаться автоматически преобразовать тип значения в другой. Существующие контексты:
-
Числовой
-
Строчный
-
Логический
-
Контекст целых чисел и строк
-
Сравнительный
-
Контекст функций
Замечание:
Когда значение нужно интерпретировать как другой тип, само значение не меняет тип.
О том, как принудительно установить тип переменной, рассказано в разделе
«Приведение типа».
О том, как изменить тип переменной, рассказано в описании функции settype().
Числовой контекст
Числовой контекст возникает при работе с
арифметическими операторами.
В этом контексте, если один из операндов — число с плавающей точкой (float)
(или не интерпретируется как целое число (int)),
оба операнда интерпретируются как число с плавающей точкой (float)
и результатом будет число с плавающей точкой (float).
В противном случае операнды будут интерпретированы как целое число (int)
и результатом также будет целое число (int).
Начиная с PHP 8.0.0, если один из операндов не может быть интерпретирован,
выбрасывается исключение TypeError.
Строчный контекст
Строчный контекст возникает при работе с языковыми конструкциями echo,
print, при интерполяции строк
или строковом операторе конкатенации.
В этом контексте значение будет интерпретироваться как строка (string).
Если значение не может быть интерпретировано, выбрасывается исключение TypeError.
До версии PHP 7.4.0 выдавалась ошибка уровня E_RECOVERABLE_ERROR
.
Контекст целых чисел и строк
Контекст целых чисел и строк возникает
при работе с побитовыми операторами.
В этом контексте, если у всех операндов тип строка (string),
результат также будет строкой (string).
В противном случае операнды будут интерпретированы как целое число (int)
и результат также будет целым числом (int).
Начиная с PHP 8.0.0, если один из операндов не может быть интерпретирован,
то будет выброшено исключение TypeError.
Контекст функций
Контекст функций возникает, когда значение передаётся типизированному параметру,
свойству или возвращается из функции, в которой объявлен тип возвращаемого значения.
В этом контексте значение должно быть значением типа.
Есть два исключения, первое: если тип значения — целое число (int),
а объявленный тип — число с плавающей точкой (float),
то целое число преобразовывается в число с плавающей точкой.
Второй: если объявленный тип — это скалярный тип,
значение преобразуемо в скалярный тип и режим строгой типизации активен (по умолчанию),
значение может быть преобразовано в допустимое скалярное значение.
Описание такого поведения дано ниже.
Внимание
Встроенные функции автоматически подставляют null
к скалярным типам,
это поведение УСТАРЕЛО с PHP 8.1.0.
Принудительная типизация с простым объявлением типов
-
Объявление типа bool: значение интерпретируется как логическое значение (bool).
-
Объявление типа int: значение интерпретируется как целое число (int),
если преобразование надёжно определимо. Например, когда строка —
числовая строка.
-
Объявление типа float: значение интерпретируется как число с плавающей точкой (float),
если преобразование надёжно определимо. Например, когда строка —
числовая строка.
-
Объявление типа string: значение интерпретируется как строка (string).
Принудительная типизация с объединением типов
Когда директива strict_types
не включена, объявления скалярных типов
подлежат ограниченному неявному приведению типов.
Если точный тип значения — не часть объединения,
то целевой тип выбран из списка в порядке убывания приоритета:
-
int
-
float
-
string
-
bool
Если тип и существует в объединении и значение может быть приведено к этому типу
в соответствии с существующей семантикой проверки типов PHP, то PHP выбирает этот тип.
В противном случае будет выбран следующий по порядку тип.
Предостережение
В качестве исключения, если значение — строка,
а целое число (int) и число с плавающей точкой (float) — это часть объединения,
предпочтительный тип будет определён существующей семантикой
числовой строки.
Например, для «42»
PHP выбирает целое число (int),
а для «42.0»
— число с плавающей точкой (float).
Замечание:
Типы, которые не входят в список предпочтений, не станут целями
для неявного приведения. Говоря конкретнее, никакого неявного приведения к типам
null, false и true не будет.
Пример #1 Пример принудительного включения типов в состав объединения
<?php
// int|string
42 --> 42 // точный тип
"42" --> "42" // точный тип
new ObjectWithToString --> "Результат __toString()"
// объект не совместим с int, переход к string
42.0 --> 42 // float совместимый с int
42.1 --> 42 // float совместимый с int
1e100 --> "1.0E+100" // float слишком велик для типа int, переход к string
INF --> "INF" // float слишком велик для типа int, переход к string
true --> 1 // bool совместимый с int
[] --> TypeError // массив не совместим с int или string
// int|float|bool
"45" --> 45 // int числовая строка
"45.0" --> 45.0 // float числовая строка
"45X" --> true // не числовая строка, переход к bool
"" --> false // не числовая строка, переход к bool
"X" --> true // не числовая строка, переход к bool
[] --> TypeError // массив не совместимый с int, float или bool
?>
Приведение типов
Приведение типа преобразовывает значение к выбранному типу,
записывая тип в круглых скобках перед преобразуемым значением.
Разрешены следующие приведения типов:
(int)
— приведение типа к целому числу (int)
(bool)
— приведение типа к логическому значению (bool)
(float)
— приведение типа к числу с плавающей точкой (float)
(string)
— приведение типа к строке (string)
(array)
— приведение типа к массиву (array)
(object)
— приведение типа к объекту (object)
(unset)
— приведение типа к NULL
Замечание:
(integer)
— псевдоним приведения типа (int)
.
(boolean)
— псевдоним приведения типа (bool)
.
(binary)
— псевдоним приведения типа (string)
.
(double)
и (real)
— псевдонимы приведения типа (float)
.
Эти приведения не используют каноническое имя типа и не рекомендуются.
Внимание
Псевдоним приведения типа (real)
устарел с PHP 8.0.0.
Внимание
Приведение типа (unset)
устарело с версии PHP 7.2.0.
Обратите внимание, что приведение (unset)
равносильно присвоению переменной или вызову значения NULL.
Приведение (unset)
удалено в PHP 8.0.0.
Предостережение
Приведение типа (binary)
и префикс b
существуют для прямой поддержки.
Типы (binary)
и (string)
идентичны, однако, это может измениться, не нужно на это полагаться.
Замечание:
PHP игнорирует пробелы в круглых скобках при приведении типа.
Поэтому следующие два приведения типов эквивалентны:
Замечание:
Вместо приведения переменной к типу строка (string) можно также заключить переменную в двойные кавычки.
Может быть неочевидно, что произойдёт при преобразовании между разными типами.
Получить дополнительную информацию можно в разделах:
Замечание:
Поскольку PHP поддерживает индексацию в строках (string) через смещения, используя тот же синтаксис,
что и индексация в массивах (array), следующий пример справедлив для всех версий PHP:
Дополнительную информацию можно найти разделе «Доступ к символу в строке и его изменение».