> 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

Reply via email to