我正在刷新我的非框架面向对象的PHP并决定进行测试。不幸的是,虽然我理解从类中调用方法的概念,但这个特定的测试稍微复杂一些,我不知道这种特殊情况的术语是什么。
创建一个PHP类,用于解析文件夹中的(未知数量)文本文件,并允许从文件中提取amount字段的总值,并获取已解析文件的文件名。
文件格式:
文件是纯文本csv文件。我们假设这些文件包含过去N天内更改的付款列表。有两种不同类型的线:
示例文件:
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方法返回一个对象,但是如何用返回的对象运行方法呢?
我试图谷歌这个,但由于我不知道这种情况的术语,我没有找到任何东西。
非常感谢任何帮助,即使这只是这种情况的术语。
答案 0 :(得分:1)
返回的对象可以是带有getFileName和getTotalAmount方法的类ParserFile
。这种方法与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%正确的解决方案,只需使用最适合您的方法。如果您遇到问题,配置文件,基准测试和重构。
希望有所帮助。干杯:)
P.S。希望这不是作业:D