【问题标题】:Running methods with returned objects使用返回的对象运行方法
【发布时间】:2010-10-29 10:22:47
【问题描述】:

我正在复习我的非框架面向对象的 PHP 并决定做一个测试。不幸的是,虽然我了解从类调用方法的概念,但这个特定的测试稍微复杂一些,我不知道这种特定情况的术语是什么。

测试

创建一个解析文件夹中(未知数量)文本文件的 PHP 类,并允许从文件中提取金额字段的总值并获取已解析文件的文件名。

文件格式:

这些文件是纯文本 csv 文件。假设文件包含过去 N 天内更改的付款列表。有两种不同类型的线:

  • 已收卡付款 - 类型 = 1、日期、订单 ID、金额
  • 信用卡付款被拒绝 - 类型 = 2、日期、订单 ID、原因、金额

示例文件:

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() ?我猜你是从解析器类中的 getFiles 方法返回一个对象,但是你怎么能用返回的对象运行方法呢?

我试图用谷歌搜索这个,但由于我不知道这种情况的术语,所以我没有找到任何东西。

非常感谢任何帮助,即使它只是这种情况的术语。

【问题讨论】:

    标签: php oop class methods


    【解决方案1】:

    返回的对象可以是 ParserFile 类,带有 getFileName 和 getTotalAmount 方法。这种方法将非常接近工厂模式,尽管最好将 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% 正确的解决方案,只需使用最适合您的解决方案。如果您随后遇到问题,请分析、基准测试和重构。

    希望对您有所帮助。干杯:)

    附:希望这不是家庭作业:D

    【讨论】:

    • 这不是家庭作业,但这不是我想要完整答案的事情,因为我想了解你如何/为什么要做你在第一个选项中所做的事情,奇怪的是,不是书中解释。我同意第二个选项是更明智的方法,并且是我最初使用的方法,然后才注意到它仍然不是用法示例中的解析器类。
    • 我在开玩笑保罗的家庭作业,虽然斜着扫描你的帖子确实让我想起了 Google Code Jam (code.google.com/codejam) 呵呵。很高兴有帮助!干杯~
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多