Hi internals,

Currently, print_r() will print ints and floats in exactly the same way, 
despite the fact that they are different types
and floats may cause a TypeError (or be treated differently from integers, e.g. 
avro encoding) when used where an integer is expected.
This is not documented in https://www.php.net/print_r

I've created https://github.com/php/php-src/pull/6611 , which proposes to have 
print_r() dump floats such as 1.0 as 1.0, like var_export currently does.

```
php > print_r(1.0);  // old behavior, proposed behavior is 1.0
1
php > print_r(1);
1
php > var_export(1.0);
1.0
php > var_export(1);
1
```

Benefits:
- print_r() previously make it look as if a value was an int when it really was 
a
  float. When using print_r() to inspect the value of an array, TypeErrors or 
differences in behavior can be unintuitive
  if you think the value is really an integer when it's actually a float.

  This change should save time debugging in the long run for users unfamiliar 
with this behavior.
  (https://www.php.net/print_r has no mention of the behavior seen for floats 
in the summary or user-submitted comments)
- print_r() output now shows a difference between 0.0 and 0,
  which is useful for generating diffs between expected and actual values in 
test failures, etc.

Cons:
- Existing tests of php, pecl extensions, and composer libraries need to be 
changed if they involve the raw output of
  print_r and dumping float values.
  If this is merged, tests would need to normalize print_r output or use format 
string expectations
  to pass in both 8.0 and 8.1 (or switch to var_dump(), var_export(), etc.)

Thanks,
- Tyson

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to