Re: Proposal: AS assertions
| From: | Rowan Tommins [IMSoP] | Date: | Fri, 22 Mar 2024 11:58:30 +0000 |
| Subject: | Re: Proposal: AS assertions | ||
| References: | 1 2 3 4 5 6 7 8 9 10 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-122725@lists.php.net to get a copy of this message | ||
On Fri, 22 Mar 2024, at 10:05, Robert Landers wrote:
> After asking an AI for some examples and usages, the most compatible
> one would be C#'s. In actuality, I think it could be hugely simplified
> if we simply return null instead of throwing. There'd be no special
> case for |null, and it would move the decision making to the
> programmer:
>
> $x = $a as int ?? throw new LogicException();
It might be relevant that C# has only recently introduced the concept of explicitly nullable
reference types, with a complex migration process for existing code: https://learn.microsoft.com/en-us/dotnet/csharp/nullable-migration-strategies
So in most C# code, there isn't actually a difference between "expect a DateTime" and
"expect a DateTime or null"
PHP, however, strictly separates those two, and always has; so this would be surprising:
$x = $a as DateTime;
assert($x instanceof DateTime); // will fail if $x has defaulted to null!
That's why I suggested that with an explcit default, the default would be automatically
asserted as matching the specified type:
$x = $a as DateTime else 'No date given'; // TypeError: string given, DateTime expected
$x = $a as DateTime|string else 'No date given'; // OK
$x = $a as DateTime else null; // TypeError: null given, DateTime expected
$x = $a as ?DateTime else null; // OK
If the statement runs without error, $x is guaranteed to be of the type (or pattern) given to the
"as" operator.
Regards,
--
Rowan Tommins
[IMSoP]