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!