Вы используете неправильную подсказку здесь.
С синтаксисом [!tagged <tag>]
будет введен один iterable
, а не неопределенное количество аргументов, как ожидается оператором splat.
Вы на самом деле набираете текст для нескольких Consumer
объектов в качестве аргументов с помощью оператора splat (...$arguments
).
Итак, ответ на ваш вопрос: оператор splat несовместим с синтаксисом [!tagged ..]
.Вам действительно нужно написать свой собственный тип внедрения, который разделяет тегированные сервисы при использовании новой нотации, такой как [!tagged-call_user_func ..]
.
Тем не менее, на самом деле не имеет смысла собирать список объектов, извлекать их как аргументы функций, просто чтобы PHP снова поместил их в список.Я понимаю вашу идею с точки зрения чистоты кода.
Еще одним ограничением является то, что вы не можете передавать множественные переменные аргументы в функцию.Итак ...
public function __construct(Alpha ...$alphas, Beta ...$betas)
... невозможно.
Возможное решение / обходной путь, позволяющий сохранить типографский шрифт для коллекции, будет следующим:
final class SynchronousMessageDispatcher implements MessageDispatcher
{
/**
* @var Consumer[]
*/
private $consumers;
public function __construct(iterable $consumers)
{
foreach($consumers as $consumer) {
assert($consumer instanceof Consumer, \InvalidArgumentException('..'));
}
$this->consumers = $consumers;
}
}