Как отмечали несколько человек, круговая зависимость возникает из-за того, что вы пытаетесь внедрить Калькулятор в MatchService и одновременно вставить MatchService в Калькулятор.Нет способа создать один до создания другого.
Если взглянуть немного глубже, кажется, что Calculator использует MatchService для получения списка пользователей.В качестве второй проблемы, калькулятор пытается получить пользователей до того, как MatchService их сгенерирует.
Вот один из возможных рефакторингов:
class Calculator
{
private $matchDao;
public function __construct(MatchDao $matchDao)
{
$this->matchDao = $matchDao;
}
public function getHourlyRate($users) // Added argument
{
$query = $this->matchDao->getSingleColumn('Payment', 'hourly_rate', 32);
}
}
class MatchService
{
private $collection;
private $calculator;
public function __construct(Collection $collection, Calculator $calculator)
{
$this->calculator = $calculator;
$this->collection = $collection;
}
public function getMatch($data)
{
$users = $this->collection->getAllUsers($data);
$this->calculator->getHourlyRate($users);
}
}
Удаление MatchService из конструктора калькулятора решает проблему циклической зависимости.Передача $ users в getHourlyRate решает проблему получения пользователей до того, как они станут доступны.
Это, конечно, только одно из возможных решений.Из вашего опубликованного кода не ясно, действительно ли для Калькулятора нужны $ пользователи.