Some arbitrary interface:

```php
interface Foo {
    public function look();
    public function at();
    public function all();
    public function these();
    public function methods();
}
```

Some arbitrary implementation...

```php
class MyFoo implements Foo {
    public function look() { /* .. */ }
    public function at() { /* .. */ }
    public function all() { /* .. */ }
    public function these() { /* .. */ }
    public function methods() { /* .. */ }
}
```

A decorator that doesn't explicitly implement that interface, and just delegates using __call to save a bunch of bullshit boilerplate:

```php
class LoggingFoo {
    private $foo;
    private $logger;

    public function __construct($foo, $logger)
    {
        $this->foo = $foo;
        $this->logger = $logger;
    }

    public function __call($method, $args)
    {
        $this->log($method, $args);
        return call_user_func_array([$this->foo, $method], $args);
    }
}
```

Some class that needs an implementation of Foo for something...

```php
class Bar {
    public function baz(Foo $foo)
    {
        // ...
    }
}
```

Try passing in a `LoggingFoo` and it won't pass the type hint:

```php
$foo = new MyFoo;
$logger = new Logger;
$loggingFoo = new LoggingFoo($foo, $logger);

$bar = new Bar;

// Explosion!
$bar->baz($loggingFoo);
```

Instead you would have to implement the interface explicitly (PHP doesn't care that you're using `__call`)...

```php
class LoggingFoo implements Foo {
    private $foo;
    private $logger;

    public function __construct($foo, $logger)
    {
        $this->foo = $foo;
        $this->logger = $logger;
    }

    public function look()
    {
        $this->logger->log('look', func_get_args());
        return $this->foo->look();
    }
    public function at()
    {
        $this->logger->log('at', func_get_args());
        return $this->foo->at();
    }
    public function all()
    {
        $this->logger->log('all', func_get_args());
        return $this->foo->all();
    }
    public function these()
    {
        $this->logger->log('these', func_get_args());
        return $this->foo->these();
    }
    public function methods()
    {
        $this->logger->log('methods', func_get_args());
        return $this->foo->methods();
    }
}
```

Fun!