Re: Proposal: AS assertions
| From: | Rowan Tommins [IMSoP] | Date: | Fri, 22 Mar 2024 09:46:22 +0000 |
| Subject: | Re: Proposal: AS assertions | ||
| References: | 1 2 3 4 5 6 7 8 9 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-122723@lists.php.net to get a copy of this message | ||
On Fri, 22 Mar 2024, at 08:17, Jordi Boggiano wrote:
> We perhaps could make sure that as does not throw if used with
>
??, or that ?? catches the type
> error and returns the right-hand expression instead:
> So to do a nullable typecast you would do:
>
> $a as int|float ?? null
>
While this limits the impact to only expressions combining as with ?? it still has the same
fundamental problem: you can't meaningfully use it with a nullable type.
As a concrete example, imagine you have an optional $description parameter, and want to ensure any
non-null values are converted to string, but keep null unchanged.
At first sight, it looks like you could write this:
$descString = $description as string|null ?? (string)$description;
But this won't work - the ?? swallows the null and turns it into an empty string, which
isn't what you wanted. You need some syntax that catches the TypeError, but preserves the null:
$descString = $description as string|null else (string)$description;
// or
$descString = $description as string|null catch (string)$description;
// or
$descString = $description as string|null default (string)$description;
I actually think there are quite a lot of scenarios where that idiom would be useful:
$optionalExpiryDateTime = $expiry as ?DateTimeInterface else new DateTimeImmutable($expiry);
$optionalUnixTimestamp = $time as ?int else strotime((string)$time);
$optionalUnicodeName = $name as ?UnicodeString else new UnicodeString( $name );
etc
And once you have that, you don't need anything special for the null case, it's just:
$nameString = $name as ?string else null;
Regards,
--
Rowan Tommins
[IMSoP]