По заданию:
У класса ApacheLogAnalyzer слишком много ответственностей и жёстких связей:
— читает данные из лога (пускай через ApacheLogReader, но всё равно);
— анализирует их;
— пишет их в БД (пускай через MysqlLogDataWriter, но всё равно)
При этом нет никакой явной необходимости инстанцировать ApacheLogReader и MysqlLogDataWriter в ApacheLogAnalyzer. Так же не вижу необходимости инстанцировать mysqli в MysqlLogDataWriter, да и вообще лучше PDO, как указали выше.
Можно сделать без сильного рефакторинга что-то вроде
$reader = new ApacheLogReader('access.log');
$db = new PDO('mysql:dbname=fl;host=localhost', 'fl', 'fl'); // @todo Обработка ошибок
$writer = new PDOLogDataWriter($db);
$analyzer = new LogAnalyzer($reader, $writer);
...
Так мы получим более гибкую и легче тестируемую архитектуру практически без накладных расходов и больших изменений. А учитывая специфику (методы ридера и райтера вызываются только в одном месте анализатора), можно сделать
$reader = new ApacheLogReader('access.log');
$log_elems = $reader->getLogElems();
$analyzer = new LogAnalyzer($log_elems);
$data = $analyzer->getAnalyzedData();
$db = new PDO('mysql:dbname=fl;host=localhost', 'fl', 'fl'); // @todo Обработка ошибок
$writer = new PDOLogDataWriter($db);
$writer->write($data);
вообще избавившись от этих зависимостей в анализаторе и сделав его ещё легче тестируемым, но тоже без глобальных изменений
Можно пойти ещё дальше, реализовать кучу интерфейсов и паттернов, и сделать анализатор вообще не зависящий ни от источника данных и их формата, ни от места их записи и формата, ни, даже, от метода анализа, но это уже будет, наверное, «ООП головного мозга» и преждевременное абстрагирование :)