On 29 Oct 2023, at 11:14, Kamil Tekiela <[email protected]> wrote:
> A code like this already throws a fatal error.
>
> function enc(string $a){}
> enc(null);
>
> The only thing remaining to be fixed in PHP 9 is to make this error
> consistent on all function invocations.
Or, be consistent with all of the other type coercions?
```
function user_function(string $s, int $i, float $f, bool $b) {
var_dump($s, $i, $f, $b);
}
user_function('1', '1', '1', '1');
// string(1) "1" / int(1) / float(1) / bool(true)
user_function(2, 2, 2, 2);
// string(1) "2" / int(2) / float(2) / bool(true)
user_function(3.3, 3.3, 3.3, 3.3);
// string(3) "3.3" / int(3), lost precision / float(3.3) / bool(true)
user_function(false, false, false, false);
// string(0) "" / int(0) / float(0) / bool(false)
```
The documentation does clearly say how NULL should be coerced:
https://www.php.net/manual/en/language.types.string.php
"null is always converted to an empty string."
https://www.php.net/manual/en/language.types.integer.php
"null is always converted to zero (0)."
https://www.php.net/manual/en/language.types.float.php
"For values of other types, the conversion is performed by converting the value
to int first and then to float"
https://www.php.net/manual/en/language.types.boolean.php
"When converting to bool, the following values are considered false [...] the
special type NULL"
Maybe documentation should be amended to say "except when being passed to a
function"?
Or, should we have fatal errors with the following as well:
```
$nullable = NULL;
print($nullable);
echo $nullable;
printf('%s', $nullable);
var_dump('A' . $nullable);
var_dump(3 + $nullable);
var_dump($nullable / 6);
var_dump('' == $nullable);
```
> Without it, you would never know that you have a logical error in your code.
But it's not an error?
Craig