Re: [RFC] Nullable Casting
| From: | Guilliam Xavier | Date: | Wed, 10 Apr 2019 14:40:18 +0000 |
| Subject: | Re: [RFC] Nullable Casting | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-105208@lists.php.net to get a copy of this message | ||
On Wed, Apr 10, 2019 at 12:52 PM Nikita Popov <nikita.ppv@gmail.com> wrote:
>
> I'm a bit concerned that there are two possible semantics for what (?int)
> does:
>
> 1. What I would intuitively expect: A fallible integer cast. I.e. try to
> cast to integer and if not possible return null. So (?int) "foobar" becomes
> null rather than 0.
> 2. What this RFC proposes: A normal integer cast that leaves null alone.
>
> Both behaviors make sense to me generally ... and if there are two ways to
> interpret a piece of syntax, I'd say the syntax is not explicit enough.
The syntax mirrors nullable type declarations, but the thing is
implicit and explicit conversions don't always behave the same today:
```php
<?php
declare(strict_types=0); // weak mode
error_reporting(-1);
$non_numeric_string = "foobar";
var_dump(array_slice([1,2,3], $non_numeric_string, null, true)); //
Warning, then prints
NULL
var_dump(array_slice([1,2,3], 0, $non_numeric_string, true)); //
prints array(0) { }
var_dump(mb_substr("abc", $non_numeric_string, null, "UTF-8")); //
Warning, then prints NULL
var_dump(mb_substr("abc", 0, $non_numeric_string, "UTF-8")); //
Warning, then prints NULL
var_dump(+$non_numeric_string); // Warning, then prints int(0)
// (I can't think of a nullable equivalent for unary +)
(function (int $x) { var_dump($x); })($non_numeric_string); // TypeError
(function (?int $x) { var_dump($x); })($non_numeric_string); // TypeError
var_dump((function ($x): int { return $x; })($non_numeric_string)); // TypeError
var_dump((function ($x): ?int { return $x; })($non_numeric_string));
// TypeError
var_dump((int) $non_numeric_string); // prints int(0)
var_dump((?int) $non_numeric_string); // ...what would you expect?
```
--
Guilliam Xavier