Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于对象分析的类_Php_Oop - Fatal编程技术网

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
        )

)