Меню

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

Приведение типа — это преобразование значения одного типа в значение другого типа.

Есть два вида приведения типов:

  • явное
  • неявное

Неявное приведение типа выполняется интерпретатором автоматически, без непосредственного участия программиста. Например, значение будет автоматически преобразовано, если оператор ожидает, числовые операнды:


$sum = "3" + 4;  // Строка "3" будет неявно преобразована в число 3

Чтобы выполнить явное приведение, нужно указать в круглых скобках имя требуемого типа непосредственно перед приводимым значением или переменной:


<?php
$num = (int)"50";
echo gettype($num);
?>

Запись имени типа в круглых скобках называется оператором приведения типа. Допускаются следующие операторы приведения типов:

  • (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:


echo (int)FALSE, "<br>";   // 0
echo (int)TRUE, "<br>";    // 1
echo (int)12.3, "<br>";    // 12
echo (int)NULL;            // 0

Строки преобразуются по следующим правилам:

  • Если первый символ строки является цифрой, знаком + или -, то интерпретатор переходит к анализу второго символа, если второй символ строки является цифрой, то интерпретатор переходит к анализу третьего символа и так до тех пор, пока не будет обнаружен символ отличный от цифры, после этого интерпретатор возвращает полученное целое число.
  • Если строка пустая или первый символ строки не является цифрой, знаком + или -, она преобразуется в 0.

echo (int)"12abc", "<br>";    // 12
echo (int)"a123bc", "<br>";   // 0
echo (int)"-12", "<br>";      // -12
echo (int)"12.3", "<br>";     // 12
echo (int)"";                 // 0

Для других типов поведение преобразования в integer не определено. Поэтому не нужно полагаться на любое наблюдаемое поведение, так как оно может измениться без предупреждения.

Приведение к числу с плавающей точкой

Строки преобразуются по следующим правилам:

  • Если первый символ строки является цифрой, точкой, знаком + или -, то интерпретатор переходит к анализу второго символа, если второй символ строки является цифрой, точкой (если перед этим была цифра), буквой e или E (если перед этим была цифра или точка), то интерпретатор переходит к анализу третьего символа и так до тех пор, пока не будет обнаружен символ, который не может быть преобразован в числовое значение, после этого интерпретатор возвращает полученное число с плавающей точкой.
  • Если строка пустая или первый символ строки не является цифрой, точкой, знаком + или -, она преобразуется в 0.

echo (float)"12abc", "<br>";    // 12
echo (float)"a123bc", "<br>";   // 0
echo (float)"-12", "<br>";      // -12
echo (float)"12.3", "<br>";     // 12.3
echo (float)".13", "<br>";      // 0.13
echo (float)"1.2e5", "<br>";    // 120000
echo (float)"1.e5";             // 100000

Значения других типов сначала преобразуются в integer, а затем уже из integer происходит преобразование в тип float.

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

Следующие значения в результате преобразования дают значение FALSE:

  • само значение FALSE
  • 0 и 0.0 (нуль)
  • пустая строка, и строка "0"
  • массив без элементов
  • NULL
  • Объекты SimpleXML, созданные из пустых тегов

Все остальные значения при преобразовании дают в результате значение TRUE. Значение FALSE и шесть значений, которые при преобразовании приводятся к этому значению, обычно называют ложными значениями, а все остальные — истинными:


echo (bool)"", ": FALSE", "<br>";   // FALSE
echo (bool)1, ": TRUE", "<br>";     // TRUE
echo (boolean)[], ": FALSE";        // FALSE

В любом контексте, когда интерпретатор PHP ожидает получить булево значение, ложные значения интерпретируются как FALSE, а истинные значения — как TRUE.

Приведение к строке

Булево значение TRUE преобразуется в строку "1", а значение FALSE преобразуется в "" (пустую строку):


echo (string)TRUE;
echo (string)FALSE, "<br>: пустая строка";

Целое число или число с плавающей точкой преобразуется в строку, состоящую из цифр числа:


echo (string)-123, "<br>";
echo (string)12.4, "<br>";
echo (string)1.4e6;        // "1400000"

Массивы всегда преобразуются в строку "Array":


$arr = [];
echo (string)$arr;

NULL всегда преобразуется в пустую строку:


echo (string)NULL, "пустая строка";

Resource всегда преобразуется в строку вида "Resource id #1".

Для преобразования объекта в строку, объект должен иметь метод __toString():


class Obj {
  public function __toString() {
    return "Object";
  }
}

$obj = new Obj;
echo (string)$obj;

Если объект не имеет метод __toString(), то в результате преобразования будет вызвана фатальная ошибка:


class Obj {}

$obj = new Obj;
echo (string)$obj;   // Будет вызвана ошибка

Приведение к NULL

Приведение к типу NULL не удаляет переменную и её значение, а лишь возвращает значение типа NULL:


$num = 10;
echo gettype((unset)$num), "<br>";
echo $num;

С этой темой смотрят: