When you follow ISP, you probably would have a lot of interfaces.
Thus, client code may require an object to implement a bunch of interfaces
depending on functionality needed.
Consider class `Bar`:
```php
interface A {}
interface B {}
interface C {}
interface D {}
interface E {}
class Bar implements A, B, C, D, E {
//
}
```
And some code, which uses `Bar`, but depends rather on interfaces, which
functionality is actually needed:
```php
function foo(A & B & E $object) {
// some work
var_dump($object);
}
```
It is currently feasable like this (ugly):
```php
function foo(A $object) {
(function(B $object) {
(function(E $object) {
// some work
var_dump($object);
})($object);
})($object);
}
```
Or like this (more readable, but still):
```php
function foo(A | B | E $object) {
if (!$object instanceof A) {
throw new \RuntimeException();
}
if (!$object instanceof B) {
throw new \RuntimeException();
}
if (!$object instanceof E) {
throw new \RuntimeException();
}
// some work
var_dump($object);
}
```
Another possible option is to create interface, which combines `A`, `B`,
`E`, but in some cases it would lead us to interfaces explosion.
This idea proposes to eliminate `instanceof` checks by introducing `&`
union operator.