Re: Numeric Type
| From: | Nikita Popov | Date: | Wed, 03 Jun 2020 10:26:06 +0000 |
| Subject: | Re: Numeric Type | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-110348@lists.php.net to get a copy of this message | ||
On Tue, Jun 2, 2020 at 5:10 PM Deleu <deleugyn@gmail.com> wrote:
> Hello Internals,
>
> I'd like to know what would be people's feelings towards having a
>
numeric
> type. I remember reading the nullable casting RFC (
> https://wiki.php.net/rfc/nullable-casting) and it's
> discussion (
> https://externals.io/message/105122). Although I would very
> much prefer to
> have nullable casting, it seems to be a bit controversial and perhaps
> Numeric Type could be a middle ground solution.
>
> The primary intent would be to safely pass around input that usually comes
> from HTTP, CI or Database. Whenever interacting with these data providers,
> string is a common format. is_int will not return true for
> integer values
> that are string, instead we need to rely on is_numeric.
> Similarly, I
> think we could benefit from having foo(?numeric $value) as a
> type-safe
> mechanism to transfer data around without having to forcefully check for
> numeric value before casting. If we simply (int) $value, we may
> end up
> casting null to 0. Type-hitting
> ?numeric could be a compromise.
>
> ```
> foo(?int $number);
>
> foo($_GET['param']); // TypeError: foo() expects int or null, string given
> foo((int) $_GET['param']); // null becomes 0
> foo($_GET['param'] ? (int) $_GET['param'] : null); // expected behavior
>
> bar(?numeric $number);
> bar($_GET['param']); // would work with any value that passes is_numeric()
> ```
>
> I also think this approach have a benefit over PHP 8 Union Type
> (int|string) because is_numeric() does not return true for string values
> and for consistency the numeric type-hint would behave
> similarly.
>
To clarify, what are the semantics of numeric? If you have a numeric
argument and "42" is passed in, will it be converted to int(42), or will it
remain as "42" (as is_numeric("42") returns true)?
From your description, it seems pretty clear that you really want the
nullable cast instead and "numeric" is just a workaround that makes a
specific case tenable. That does not seem like a good position to argue
from. I think it would make more sense to see the nullable cast RFC through
to the end first. As far as I remember, it never did go to vote.
Regards,
Nikita