interface LoggerInterface { /** * System is unusable. * * @param string $message * @param mixed[] $context * * @return void */ public function emergency($message, array $context = array()); /** * Detailed debug information. * * @param string $message * @param mixed[] $context * * @return void */ public function debug($message, array $context = array()); /** * Logs with an arbitrary level. * * @param mixed $level * @param string $message * @param mixed[] $context * * @return void * * @throws \Psr\Log\InvalidArgumentException */ public function log($level, $message, array $context = array()); } class NullLogger implements LoggerInterface { /** * @inheritDoc */ public function emergency($message, array $context = array()) { $this->log(LogLevel::EMERGENCY, $message, $context); } /** * @inheritDoc */ public function debug($message, array $context = array()) { $this->log(LogLevel::DEBUG, $message, $context); } /** * @inheritDoc */ public function log($level, $message, array $context = array()) { // noop } } function get_logger(): LoggerInterface { try { // some magic code to initialize and return a logger } catch (Logger_Cannot_Initialize $e) { return new NullLogger(); } }