Php 用于对象分析的类
目前设计的类旨在分析车辆的路线 例如,我需要计算各个路段的燃油价格,然后将其汇总为每月的路线 整个月有一个燃油费率 我是这样计划的:Php 用于对象分析的类,php,oop,Php,Oop,目前设计的类旨在分析车辆的路线 例如,我需要计算各个路段的燃油价格,然后将其汇总为每月的路线 整个月有一个燃油费率 我是这样计划的: class FullRoute{ public function setFuelCost($cost){} public function addRoute(Route $route){} public function getDistance(){ // sum routes distance } } class Route
class FullRoute{
public function setFuelCost($cost){}
public function addRoute(Route $route){}
public function getDistance(){
// sum routes distance
}
}
class Route{
public function setFuelCost($cost){}
public function setDistance($distance){}
public function getDistance(){}
public function getCost(){
//returns cost of route;
}
}
我想知道这是否是一个好方法,还有更多的方法-这只是一个例子
从FullRoute类中,我想做一个总结,这就是为什么我添加了setFuelCost方法-总结是返回从所有剧集计算的距离,但也返回标准(作为燃油率-这就是为什么使用此方法)
也许有人解决了类似的问题,并对如何设计它提出了一些建议?
感谢您的帮助也许您可以尝试以下方式:
class Route {
public function setDistance($distance_miles) {
}
public function getDistance() {
}
public function getCost($price_per_galon, $miles_per_galon) {
}
public function getFuelUsed($miles_per_galon) {
}
}
class RoutesSummary {
public function __construct($price_per_galon, $miles_per_galon) {
}
public function addRoute(Route $route) {
}
public function getTotalDistance(){
// sum routes distances
}
public function getTotalCost() {
$cost = 0;
foreach($this->routes as $route) {
$cost += $route->getCost(
$this->price_per_galon,
$this->miles_per_galon
);
}
return $cost;
}
public function getTotalFuelUsed() {
// sum routes fuel used
}
public function getDetail() {
// return list of route costs
}
}
此外,您还可以利用和设计模式 这将允许您将RouteSection(SplObserver)注入到Route(SplSubject)中,并一次性更新报告,而不需要两个类中的getter和setter 还有一个实例
$route
,您可以调用它来获取报告/数据
下面是一个例子,我认为它涵盖了您的目标:
<?php
/**
* Route
*/
class Route implements \SplSubject {
private $data;
private $observers = array();
private $content;
public function __construct($data) {
$this->data = $data;
$this->report = [];
$this->total_cost = 0;
$this->total_distance = 0;
}
// getters
public function getRoute() {
return $this->data['name'];
}
public function getDistance() {
return $this->data['distance'];
}
public function getReport() {
return $this->report;
}
public function getTotalCost() {
return number_format($this->total_cost, 2);
}
public function getTotalDistance() {
return $this->total_distance;
}
// run
public function run() {
$this->notify();
}
// spl pub/sub methods
public function attach(\SplObserver $observer) {
$this->observers[] = $observer;
}
public function detach(\SplObserver $observer) {
$key = array_search($observer, $this->observers, true);
if ($key) {
unset($this->observers[$key]);
}
}
public function notify() {
foreach ($this->observers as $value) {
$value->update($this);
}
}
}
/**
* RouteSection
*/
class RouteSection implements SplObserver {
private $vehicle;
private $driver;
public function __construct($vehicle, $driver) {
$this->vehicle = $vehicle;
$this->driver = $driver;
}
public function update(\SplSubject $subject) {
$subject->report[$this->vehicle['id']] = [
'route' => $subject->getRoute(),
'vehicle' => $this->vehicle,
'driver' => $this->driver,
'distance' => $subject->getDistance(),
'cost' => $subject->getDistance() * $this->vehicle['ppm']
];
$subject->total_distance += $subject->report[$this->vehicle['id']]['distance'];
$subject->total_cost += $subject->report[$this->vehicle['id']]['cost'];
}
}
// define some drivers
$drivers[] = ['id' => 1, 'name' => 'Lawrence'];
$drivers[] = ['id' => 2, 'name' => 'Paul'];
$drivers[] = ['id' => 3, 'name' => 'Simon'];
// define some vehicles (ppm could be defined single value)
$vehicles[] = ['id' => 1, 'name' => 'Truck A', 'ppm' => 0.001];
$vehicles[] = ['id' => 2, 'name' => 'Truck B', 'ppm' => 0.003];
$vehicles[] = ['id' => 3, 'name' => 'Truck C', 'ppm' => 0.006];
// define route
$route = new Route([
'id' => 1,
'name' => 'San José',
'distance' => 220
]);
// create & attach RouteSection with vehicle and driver
foreach ($drivers as $key => $driver) {
$route->attach(new RouteSection(
$vehicles[$key], // vehicle
$driver // driver
));
}
// run route
$route->run();
//
echo 'Total Distance: '.$route->getTotalDistance().PHP_EOL;
//
echo 'Total Cost: '.$route->getTotalCost().PHP_EOL;
echo PHP_EOL;
// get report
print_r($route->getReport());
谢谢你的回答!我忘了补充我需要从summary类中获得详细信息,即特定路线上的燃油成本,使用了多少升,等等,这就是为什么我为路线类添加了setters和getter我给你的模型允许你计算每条路线的成本和总成本。我添加了一个示例谢谢,这似乎是一个很好的解决方案。我仍然担心一件事。如果在演示层,我想显示以下详细信息:路线的公里数和总燃料成本,然后列出每条路线的公里数和成本。我是否应该将这些值作为数组从RouteSummary类中计算出来?我计划在echo样式的路由->getCost()中使用它-我是否必须通过给函数提供参数来重新计算它?您可以通过迭代每个路由并获得通过price和mpg参数的成本来呈现细节。否则,您可以将detail($price_per_galon,$miles_per_galon)函数添加到RouteSummary,该函数返回一个包含各个路线成本的数组。然后直接从summary对象获取所有摘要数据
Total Distance: 660
Total Cost: 2.20
Array
(
[1] => Array
(
[route] => San José
[vehicle] => Array
(
[id] => 1
[name] => Truck A
[ppm] => 0.001
)
[driver] => Array
(
[id] => 1
[name] => Lawrence
)
[distance] => 220
[cost] => 0.22
)
[2] => Array
(
[route] => San José
[vehicle] => Array
(
[id] => 2
[name] => Truck B
[ppm] => 0.003
)
[driver] => Array
(
[id] => 2
[name] => Paul
)
[distance] => 220
[cost] => 0.66
)
[3] => Array
(
[route] => San José
[vehicle] => Array
(
[id] => 3
[name] => Truck C
[ppm] => 0.006
)
[driver] => Array
(
[id] => 3
[name] => Simon
)
[distance] => 220
[cost] => 1.32
)
)