Принудительное преобразование типов в PHP
Иногда нам может понадобится принудительно преобразовать один тип данных в другой. Давайте посмотрим, как это делается.
Целые числа
Пусть, к примеру, у нас есть строка с цифрами:
Давайте преобразуем ее в целое число. Для этого используем специальную команду int , вот так:
Можно воспользоваться командой преобразования прямо в вызове функции:
Можно преобразовать значение переменной:
Преобразуйте следующую строку в число:
Дробные числа
Пусть теперь у нас есть строка с дробным числом:
Для преобразования этой строки в число следует воспользоваться командой float :
Преобразуйте следующую строку в число:
Преобразование дроби к целому числу
Использование команды int для дроби приведет к тому, что от дроби извлечется только целая часть:
Аналогичным образом команда сработает в том случае, если у нас не строка с дробью, а просто дробь как число:
PHP: Приведение типов
Приведение типа — это преобразование значения одного типа в значение другого типа.
Есть два вида приведения типов:
- явное
- неявное
Неявное приведение типа выполняется интерпретатором автоматически, без непосредственного участия программиста. Например, значение будет автоматически преобразовано, если оператор ожидает, числовые операнды:
Чтобы выполнить явное приведение, нужно указать в круглых скобках имя требуемого типа непосредственно перед приводимым значением или переменной:
Запись имени типа в круглых скобках называется оператором приведения типа. Допускаются следующие операторы приведения типов:
- (int), (integer) — приведение к integer .
- (bool), (boolean) — приведение к boolean .
- (float), (double), (real) — приведение к float .
- (string) — приведение к string .
- (array) — приведение к array .
- (object) — приведение к object .
- (unset) — приведение к NULL .
Приведение к целому числу
При приведении bool в integer , FALSE преобразуется в 0 (нуль), а TRUE — в 1 (единицу). При приведении float в integer , дробная часть будет округлена в сторону нуля. Значение NULL преобразуется в 0:
Строки преобразуются по следующим правилам:
- Если первый символ строки является цифрой, знаком + или — , то интерпретатор переходит к анализу второго символа, если второй символ строки является цифрой, то интерпретатор переходит к анализу третьего символа и так до тех пор, пока не будет обнаружен символ отличный от цифры, после этого интерпретатор возвращает полученное целое число.
- Если строка пустая или первый символ строки не является цифрой, знаком + или — , она преобразуется в 0.
Для других типов поведение преобразования в integer не определено. Поэтому не нужно полагаться на любое наблюдаемое поведение, так как оно может измениться без предупреждения.
Приведение к числу с плавающей точкой
Строки преобразуются по следующим правилам:
- Если первый символ строки является цифрой, точкой, знаком + или — , то интерпретатор переходит к анализу второго символа, если второй символ строки является цифрой, точкой (если перед этим была цифра), буквой e или E (если перед этим была цифра или точка), то интерпретатор переходит к анализу третьего символа и так до тех пор, пока не будет обнаружен символ, который не может быть преобразован в числовое значение, после этого интерпретатор возвращает полученное число с плавающей точкой.
- Если строка пустая или первый символ строки не является цифрой, точкой, знаком + или — , она преобразуется в 0.
Значения других типов сначала преобразуются в integer , а затем уже из integer происходит преобразование в тип float .
Приведение к булеву типу
Следующие значения в результате преобразования дают значение FALSE :
- само значение FALSE
- 0 и 0.0 (нуль)
- пустая строка, и строка «0»
- массив без элементов
- NULL
- Объекты SimpleXML , созданные из пустых тегов
Все остальные значения при преобразовании дают в результате значение TRUE . Значение FALSE и шесть значений, которые при преобразовании приводятся к этому значению, обычно называют ложными значениями, а все остальные — истинными:
В любом контексте, когда интерпретатор PHP ожидает получить булево значение, ложные значения интерпретируются как FALSE , а истинные значения — как TRUE .
Приведение к строке
Булево значение TRUE преобразуется в строку «1», а значение FALSE преобразуется в «» (пустую строку):
Целое число или число с плавающей точкой преобразуется в строку, состоящую из цифр числа:
Массивы всегда преобразуются в строку «Array» :
NULL всегда преобразуется в пустую строку:
Resource всегда преобразуется в строку вида «Resource id #1» .
Для преобразования объекта в строку, объект должен иметь метод __toString() :
Если объект не имеет метод __toString() , то в результате преобразования будет вызвана фатальная ошибка:
Приведение к NULL
Приведение к типу NULL не удаляет переменную и её значение, а лишь возвращает значение типа NULL :
Как преобразовать строку в число в PHP
Как мы знаем, PHP не требует и не поддерживает явное определение типа в объявлении переменной. Однако вы можете заставить переменную оцениваться как определенный тип, используя приведение типа.
Давайте попробуем следующий пример, чтобы понять, как это работает:
Вы можете использовать (int) или (integer) , чтобы преобразовать переменную в целое число, использовать (float) , (double) или (real) , чтобы преобразовать переменную в float (десятичное число). Точно так же вы можете использовать (string) для преобразования переменной в строку и т. д.
Функция PHP gettype() возвращает « double » в случае числа с плавающей запятой по историческим причинам.
В качестве альтернативы вы также можете использовать функцию intval() для получения целочисленного значения переменной.
Манипуляции с типами
PHP не требует (и не поддерживает) явного определения типа при объявлении переменной; тип переменной определяется по контексту, в котором она используется. То есть, если вы присвоите строковое значение переменной $var, $var станет строкой. Если вы затем присвоите $var целочисленное значение, она станет целым числом.
Примером автоматического преобразования типа является оператор сложения ‘+’. Если любой из операндов является числом с плавающей точкой, то все операнды интерпретируются как числа с плавающей точкой, результатом будет также число с плавающей точкой. В противном случае операнды будут интерпретироваться как целые числа и результат также будет целочисленным. Обратите внимание, что это НЕ меняет типы самих операндов; меняется только то, как они вычисляются.
Если последние два примера вам непонятны, смотрите Преобразование строк в числа.
Если вы хотите, чтобы переменная принудительно вычислялась как определенный тип, смотрите раздел приведение типов. Если вы хотите изменить тип переменной, смотрите settype().
Если вы хотите протестировать любой из примеров, приведенных в данном разделе, вы можете использовать функцию var_dump().
Замечание: Поведение автоматического преобразования в массив в настоящий момент не определено.
Поскольку PHP поддерживает индексирование в строках с использованием такого же синтаксиса, как и при индексировании массива, вышеприведенный пример приводит к проблеме: следует ли $a стать массивом, первым элементом которого будет «f» или «f» должна стать первым символом строки $a?
Текущая версия PHP воспринимает второе присваивание как определение смещения строки, поэтому $a станет «f», результат же этого автоматического преобразования следует, однако, рассматривать как неопределенный. В PHP 4 для доступа к символам строки был введен новый синтаксис фигурных скобок, используйте этот синтаксис вместо вышеприведенного:
Для дополнительной информации смотрите раздел Доступ к символу в строке.
Приведение типов
- Допускаются следующие приведения типов:
- (int), (integer) — приведение к целому числу
- (bool), (boolean) — приведение к булеву типу
- (float), (double), (real) — приведение к числу с плавающей точкой (float)
- (string) — приведение к строке
- (array) — приведение к массиву
- (object) — приведение к объекту
Обратите внимание, что внутри скобок допускаются пробелы и символы табуляции, поэтому следующее равносильно по своему действию:
Замечание: Вместо приведения переменной к строке, вы можете заключить ее в двойные кавычки.
Возможно, вам не совсем ясно, что происходит при приведении между типами. Для дополнительной информации смотрите разделы: