Запуск методов с возвращенными объектами - PullRequest
0 голосов
/ 29 октября 2010

Я разбираюсь в своем неориентированном объектно-ориентированном PHP и решил сделать тест.К сожалению, хотя я понимаю концепцию вызова методов из класса, этот конкретный тест немного сложнее, и я не знаю, какова терминология для этого конкретного типа ситуации.

Тест

Создание класса PHP, который анализирует (неизвестное количество) текстовых файлов в папке и позволяет извлечь из файла общее значение поля суммы и получить имена файлов проанализированных файлов.

Формат файла:

Файлы представляют собой простые текстовые CSV-файлы.Предположим, что файлы содержат список платежей, измененных за последние N дней.Существует 2 различных типа линии:

  • Получена оплата картой - тип = 1, дата, идентификатор заказа, сумма
  • Отклонен платеж картой - тип = 2, дата, идентификатор заказа,причина, сумма

Файл примера:

1 20090313 542,11,99
1 20090313 543 9,99
2 20090312, 500, почему-то, 2.99

Пример использования:

Использование может быть примерно таким:

$parser = new Parser(...);
$files = $parser->getFiles();

foreach ($files as $file) {
    $filename = $file->getFileName();
    $amount_collected = $file->getTotalAmount(...); 
    $amount_rejected = $file->getTotalAmount(...);
}

Мой вопрос:

Как вы можете сделать $ file-> method (), когда класс называется parser?Я предполагаю, что вы возвращаете объект из метода getFiles в классе синтаксического анализатора, но как вы можете запускать методы с возвращенным объектом?

Я пытался найти это в Google, но я не знаю терминологию дляв этой ситуации я ничего не нашел.

Любая помощь очень ценится, даже если это просто терминология для этой ситуации.

1 Ответ

1 голос
/ 29 октября 2010

Возвращаемый объект может быть класса ParserFile с методами getFileName и getTotalAmount.Этот подход очень близок к шаблону Factory, хотя было бы неплохо сделать метод getFiles статичным, вызываемым без самого класса анализатора.

class ParserFile {
    public function getFilename() { /* whatever */ }
    public function getTotalAmount() { /* whatever */ }
}

class Parser {
    public static function getFiles() {
        // loop through the available files
        // and store them in some $arr
        $arr[] = new ParserFile('filename1.txt');
        $arr[] = new ParserFile('filename2.txt');

        return $arr;
    }
}

$files = Parser::getFiles();
foreach ($files as $file) {
    $filename = $file->getFilename();
    $amount_collected = $file->getTotalAmount();
    $amount_rejected = $file->getTotalAmount();
}

Хотя я почти уверен, что это не таклучший дизайн.Другой подход:

$parser = new Parser();
$files = $parser->getFiles();
foreach ($files as $file) {
    $filename = $parser->getFilename($file);
    $amount_collected = $parser->getTotalAmount($file);
    $amount_rejected = $parser->getTotalAmount($file);
}

Таким образом, вы получите массив файлов в свой $files, но когда вы захотите проанализировать эти файлы, вы попросите $parser сделать это для вас, передавтекущий $file его методам.

Я думаю, что нет 100% правильного решения, просто используйте то, что лучше для вас.Если у вас возникли проблемы, профиль, тест и рефакторинг.

Надеюсь, что это помогло.Приветствия:)

PS Надеюсь, это не домашнее задание: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...