Hi all,

One thought is that `is_numeric(true)` will return `false`, but the `int`
type-hint will accept it as a `1`.

The other thought I had was no one mentioned floats, so maybe a `number`
type could be argued for but with mixed types that can be solved by
`int|float` now.

Thanks,
Peter


On Tue., Jun. 2, 2020, 08:10 Deleu, <deleu...@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.
>
> Thoughts?
>
> --
> Marco Aurélio Deleu
>

Reply via email to