> Am 02.06.2016 um 19:33 schrieb Rowan Collins <rowan.coll...@gmail.com>:
> 
> On 02/06/2016 18:11, Andrea Faulds wrote:
>> That aside, the behaviour the RFC now specifies for how weak typing
>> interacts with union types is frighteningly complicated. I don't see how
>> it could be anything other than that, but the new complexity this
>> introduces to PHP is enough for me to vote against this RFC, even
>> ignoring my other concerns.
> 
> That is rather a long-winded set of rules, I agree. I wonder if it's possible 
> for the order the union type is defined to be taken into account? That way 
> you could specify the rule thus:
> 
> * The type is tested against each type in the union in turn.
> * If weak typing is active, scalar types will be coerced where this would 
> normally be allowed, and passed over where a TypeError would be thrown.
> * If strict typing is active, scalar types will be treated the same as 
> non-scalar types, and must match precisely.
> 
> 
> So:
> 
> function f(int | float $number) { echo gettype($number); }
> f('10'); // int
> 
> function g(float | int $number) { echo gettype($number); }
> g('10'); // float
> 
> function h(int | Foo | string) { echo gettype($number); }
> h('10'); // int
> h(new Foo); // object
> h('hello'); // string
> 
> function i(string | int) { echo gettype($number); }
> i('10'); // string
> i(10); // string
> 
> This last example is the only one that might be a bit surprising - the "| 
> int" in the type def is actually doing nothing - but there's always scope for 
> user error.
> 
> 
> In strict mode, things would be a bit different, because no coercion is 
> allowed:
> 
> declare(strict_types=1);
> 
> function f(int | float $number) { echo gettype($number); }
> f('10'); // [!] TypeError
> 
> function g(float | int $number) { echo gettype($number); }
> g('10'); // [!] TypeError
> 
> function h(int | Foo | string) { echo gettype($number); }
> h('10'); // string
> h(new Foo); // object
> h('hello'); // string
> 
> function i(string | int) { echo gettype($number); }
> i('10'); // string
> i(10); // int
> 
> 
> It may be that the implementation makes this prohibitively difficult, but it 
> would certainly be easier to document than the rules currently proposed.
> 
> Regards,
> -- 
> Rowan Collins
> [IMSoP]

We had that exact idea relatively early, but it exposes other problems… order 
suddenly matters. You cannot just add "a" type and get the expected results.

E.g.
function f(true | string $foo) { ... }

everything except 0, ±0, "0" and "" would now return true. That's totally WTF. 
Sure, it's more friendly for people who want to read *rules*. But it is very 
bad for intuitivity.

Also:

> function i(string | int) { echo gettype($number); }
> i('10'); // string
> i(10); // string

This. This is especially bad as it has different behaviors in strict and weak 
mode then. That's a no-go.

The current way is the only viable one, as far as we discovered.

Bob
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to