strval()
Функция strval() в PHP преобразует значение любого типа данных в строку. Узнайте о правилах преобразования и особых случаях.
Введение
strval() — это встроенная PHP-функция, которая возвращает строковое представление скалярного значения. Это явный и читаемый способ сказать «дай мне это значение в виде строки» — то же самое преобразование, которое PHP выполняет неявно при выводе значения через echo или конкатенации с ., но записанное так, чтобы ваше намерение было очевидным.
На этой странице рассказывается, что возвращает strval() для каждого типа данных, как функция обрабатывает null, булевы значения, числа с плавающей точкой, массивы и объекты, а также когда стоит использовать её вместо приведения типов или родственных функций, таких как intval(), floatval() и boolval().
Синтаксис
strval(mixed $value): stringstrval() принимает один аргумент — $value — и возвращает string, представляющую его. Функция работает с любым скаляром (int, float, bool, string), с null, а также с объектами, реализующими __toString(). Передача массива возвращает буквальную строку "Array" и вызывает предупреждение (см. раздел Особые случаи).
Простой пример
Преобразование целого числа, числа с плавающей точкой и булевого значения в строки:
$var1 — целое число, $var2 — число с плавающей точкой, а $var3 — булевое значение. Каждое из них преобразуется в строковую форму. Обратите внимание: true становится "1" — это часто удивляет новичков и является самой важной особенностью, которую стоит запомнить.
Как каждый тип преобразуется
strval() следует стандартным правилам PHP по работе с типами. В таблице ниже приведены результаты для каждого скалярного типа и для null.
| Входное значение | Результат strval() | Примечания |
|---|---|---|
10 (int) | "10" | Цифры в том же виде |
3.14 (float) | "3.14" | Использует параметр ini precision |
true (bool) | "1" | |
false (bool) | "" | Пустая строка, не "0" |
null | "" | Пустая строка |
"hello" (string) | "hello" | Возвращается без изменений |
Правила false → "" и null → "" стоит запомнить — именно они чаще всего являются причиной ошибок с пустым выводом:
<?php
var_dump(strval(false)); // string(0) ""
var_dump(strval(null)); // string(0) ""
var_dump(strval(true)); // string(1) "1"
?>strval() vs. приведение типов vs. конкатенация
Все три способа дают одинаковый результат для скаляров, поэтому выбор определяется удобочитаемостью:
<?php
$n = 42;
$a = strval($n); // "42" — explicit, named, greppable
$b = (string) $n; // "42" — language cast
$c = "$n"; // "42" — string interpolation
$d = $n . ""; // "42" — concatenation trick (avoid)
?>Предпочитайте strval() или приведение (string), когда хотите быть явными. strval() особенно удобна в одной ситуации, где приведение типов не работает: она является вызываемой (callable), поэтому её можно передавать в функции высшего порядка, такие как array_map():
<?php
$numbers = [1, 2, 3, 4];
// Turn every element into a string in one line.
$strings = array_map('strval', $numbers);
print_r($strings);
// Array
// (
// [0] => 1
// [1] => 2
// [2] => 3
// [3] => 4
// )
var_dump($strings[0]); // string(1) "1"
?>Нельзя написать array_map('(string)', $numbers) — приведение типов не является callable, — поэтому strval — это чистый способ применить преобразование к каждому элементу коллекции.
Числа с плавающей точкой: следите за точностью
Числа с плавающей точкой форматируются с использованием директивы ini precision (по умолчанию 14 значимых цифр), а очень большие или очень маленькие числа переводятся в научную нотацию. Это означает, что strval() не является правильным инструментом для отображения денежных сумм или вывода с фиксированным числом десятичных знаков — для этого используйте number_format() или sprintf().
<?php
echo strval(0.1 + 0.2) . "\n"; // 0.3 (precision rounds the float error)
echo strval(1.0) . "\n"; // 1 (trailing ".0" is dropped)
echo strval(1.0e21) . "\n"; // 1.0E+21 (scientific notation)
// For a fixed two-decimal price, use sprintf instead:
echo sprintf('%.2f', 1.0) . "\n"; // 1.00
?>Особые случаи: массивы и объекты
strval() предназначена для скаляров. Два нескалярных случая ведут себя особым образом:
Массивы преобразуются в буквальную строку "Array" и вызывают предупреждение — почти никогда это не то, что вам нужно. Чтобы превратить массив в текст, используйте implode() или json_encode():
<?php
$data = [1, 2, 3];
echo strval($data); // Warning: Array to string conversion -> "Array"
echo implode(', ', $data); // 1, 2, 3
echo json_encode($data); // [1,2,3]
?>Объекты преобразуются путём вызова их метода __toString(). Если класс не определяет этот метод, PHP выбрасывает ошибку Error:
<?php
class Money
{
public function __construct(private float $amount) {}
public function __toString(): string
{
return sprintf('$%.2f', $this->amount);
}
}
echo strval(new Money(5)); // $5.00
?>Когда использовать strval()
- Применение преобразования к коллекции с помощью
array_map('strval', $items)— основной сценарий использования. - Принудительная строковая семантика перед строгим сравнением (
===) или при передаче в API или функцию с указанием типаstring. - Самодокументирующийся код, где именованный
strval()читается понятнее, чем явное приведение(string).
Для обратных преобразований смотрите функции-аналоги intval(), floatval() и boolval(). Чтобы проверить тип значения перед преобразованием, используйте gettype() или измените его на месте с помощью settype().
Заключение
strval() возвращает строковое представление скалярного значения, следуя правилам неявного преобразования PHP, но явно выражая ваше намерение. Запомните три особенности: true становится "1", и false, и null становятся пустой строкой "", а массивы превращаются в "Array" с предупреждением. Используйте её, когда вам нужна строковая callable (особенно с array_map), и обращайтесь к number_format() или sprintf(), когда требуется контролируемое форматирование чисел.