$logger) { $logger->log('foo'); } } class FileLogger { public function log($message) { file_put_contents('somelogfile', $message); } } class StringLogger implements Logger { public function log($message) {} } class StaticLogger { public static function log($message) { /* blah */ } } class OtherLogger { public static function log($message, $bar) { /* blah */ } } Bar::foo(new FileLogger); // Good! Bar::foo(new StringLogger); // Good! Bar::foo(new StaticLogger); // Bad! STATIC does not match! Bar::foo(new OtherLogger); // Bad! Arg count does not match! ?>