Может ли приведение PHP (float) когда-либо возвращать не-плавающее значение? - PullRequest
0 голосов
/ 29 февраля 2020

Я отлаживаю некоторый код, и предыдущий разработчик написал:

if (!is_float((float)$value)) {
  throw new \Exception();
}

В приведенной ниже таблице R - это результат преобразования VALUE с указанным TYPE в (float) , x означает, что здесь возможны разные значения.

R     TYPE VALUE
-     ---- -----
0          null
0     bool false
1     bool true
x      int x
x    float x
0   string 'invalid'
x   string 'x'
0    array []
1    array [x]
1   object x (raises a notice)
x resource handle (unintuitive)

Мне не удалось найти значение, которое нельзя преобразовать в (float). Возможно ли вообще выбросить вышеупомянутый \Exception?

Документация PHP гласит:

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

Информацию о преобразовании строк в число с плавающей запятой см. В разделе Преобразование строк в числа. Для значений других типов, преобразование выполняется путем преобразования значения сначала в целое число, а затем в число с плавающей запятой . См. Преобразование в целое число для получения дополнительной информации. По состоянию на PHP 5 выдается уведомление, если объект преобразован в число с плавающей точкой.

(выделено мной)

Итак, насколько я могу судить, вышеприведенное \Exception недоступен код Это правильно, или другой разработчик знает что-то, чего я не знаю?

1 Ответ

0 голосов
/ 29 февраля 2020

В настоящее время это невозможно.

Однако это может измениться.

Причина в том, что преобразование в целое число из массива и (не строковых) объектов является технически неопределенным поведением, см. документацию по приведению к целому числу. https://www.php.net/manual/en/language.types.integer.php#language .types.integer.casting

Поскольку массивы и объекты в настоящее время не выдают ошибок типов при попытке преобразования в целое число, это означает, что всегда есть целочисленное представление.

Поскольку целое число всегда может быть представлено с плавающей точкой (и оно может даже перетекать в число с плавающей точкой, если оно слишком большое). Эта проверка (в настоящее время) всегда ложна.

(Примечание: преобразование с плавающей запятой дескриптора ресурса - это просто номер дескриптора ресурса, выделенный PHP этому ресурсу.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...