> -----Original Message----- > From: jesseschal...@gmail.com [mailto:jesseschal...@gmail.com] On > Behalf Of Jesse Schalken > Sent: Wednesday, April 20, 2016 1:12 PM > To: Johannes Schlüter <johan...@schlueters.de> > Cc: Andrea Faulds <a...@ajf.me>; PHP internals <internals@lists.php.net> > Subject: Re: [PHP-DEV] Re: Improving PHP's type system > > 1. I have a function that converts values to SQL which have SQL > equivalents, including decimal values represented by a special Decimal > class. It accepts int|string|bool|null|float|Decimal. > 2. I have a class Expr which represents an expression in SQL. > Expressions can be composed of other expressions, and of literal values, so > the constructors for Exprs accept int|string|bool|null|float|Decimal|Expr. > 3. I have a function that converts values to JSON that can be reliably > converted back into their original. It accepts int|string|bool|null|float.
In other words, they accepts scalars (or nullable scalars). Introducing a scalar type would do the job. > 4. I have a function that returns the first key in an array (or throws > an exception if empty). It returns int|string. I'd argue that here too, a scalar would be fine. Worrying about a floating point here is not a very relevant worry. > 5. I have a function that returns a value for a key in an array, and > removes the key. The type of the key is things that are valid array keys > (int|string|bool|null IIRC). Scalar (or nullable scalar). > 6. I have a set of functions which operates on numbers. They accept > int|float. Numeric (to also include strings that look like numbers when strict is not on). > 7. All the PHP functions which say "returns ... or FALSE on failure" > have their correct return type as T|false (where T is the return value on > success) (or T|bool is "false" is not an allowed type). How many of those do we have? As opposed to T|null? I think most functions that return objects return null on failure, not false. And those who don't can probably evolve to that approach. > 8. Nullability is nothing but a special case of union type with T|null. Academically that's true, but practically speaking, the general T1|T2 is almost always bogus while T|null subset makes a lot of sense. In reality, we can solve all the relevant use cases for union types by relatively minor tweaks (or rather additions) to our scalar type hints, by adding nullability, and by using interfaces where they make sense. Zeev