Magic method __invoke объекта - проперти другого класса?

AnrDaemon

Продвинутый новичок
Есть код типа такого:

PHP:
class Logger {
  public function addMessage($msg){
    print($msg);
  }
}

class Service {
  protected $logger;

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

  public function action(){
    $this->logger->addMessage('…');
  }
}

$x = new Service(new Logger());
$x->action();
Хочется же красивого…

PHP:
class Logger {
  public function __invoke($msg){
    print($msg);
  }
}

class Service {
  protected $logger;

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

  public function action(){
    $this->logger('…');
  }
}

$x = new Service(new Logger());
$x->action();
Результат, правда, слегка предсказуем - фейл "нет такого метода".
Я, видимо, хочу от PHP чего-то очень странного?
Или можно как-то это сделать более прямо, чем
PHP:
  public function action(){
    $logger = $this->logger;
    $logger('…');
  }
Причём самое смешное, что
Код:
is_callable($this->logger) == 1
.
Что, call_user_func звать на помощь?
 

AnrDaemon

Продвинутый новичок
Общественность предлагает танцевать с __call контейнера…
 

AnrDaemon

Продвинутый новичок
Это, кстати, мысль! Причём такой код читается намного легче.
 
Сверху