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.

Reply via email to