> Am 3.6.2016 um 18:49 schrieb Larry Garfield <la...@garfieldtech.com>: > > On 06/03/2016 10:16 AM, Jordi Boggiano wrote: >> On 03/06/2016 15:58, Thomas Bley wrote: >>> To me type declarations help to make my code easier and more consistent. >>> Having multiple scalar types for a single function parameter is against >>> this goal since I need extra logic to handle this. >>> >>> e.g. function foo(string | int | bool $bar) {} makes no sense in weak mode >>> since string can already handle int, bool, float, etc. >>> >>> having different behavior between >>> foo("42"); function foo(string $b) {echo gettype($b);} // string >>> and >>> foo("42"); function foo(string | int $b) {echo gettype($b);} // integer >>> also makes no sense to me. >>> >>> Things like string|array are useful (e.g. str_replace) since we can cast >>> the string easily to array and calling a string parameter with an array >>> would give a fatal error. >> >> That is a useful case, and don't forget also return values, e.g. all the >> XX|false-kind of return types it's also nice to have. >> >> I don't think for function arguments it's massively useful and I doubt it'll >> get put everywhere, but it's nice to be able to express this when you have >> to. >> >> Cheers > > For parameters, I really don't think | is going to be the common use case. > (It should still be rational, but I don't expect to see it day to day.) > InterfaceA & InterfaceB Is the more useful use case for parameters. | is, as > noted, likely more useful on returns. (even though I would discourage their > use in most cases for reasons I won't go into here). > > --Larry Garfield
It won’t and it should not be *common*. But there are legit uses cases: https://github.com/amphp/aerys/blob/2a4d626fb1b8b8ac9d91711085c04eaabdec7768/lib/Host.php#L87 <https://github.com/amphp/aerys/blob/2a4d626fb1b8b8ac9d91711085c04eaabdec7768/lib/Host.php#L87> This concrete example shows that a class may implement multiple concrete interfaces which all get the same/similar behavior locally. [And somewhere else the code checks for each element in the array what classes it implements and marks them appropriately.] Sure, you could have ->addMiddleware($foo)->addRequest($foo) … or just a single ->add($foo). It’s maybe not the most pure API, but the most practical one. But I agree, I myself would discourage usage of union types in most cases too; but there *are* legitimate cases which shall be also properly typable. Thus we need it. Bob