如何在PHP中创建抽象?

时间:2018-04-14 19:47:59

标签: php oop

我的目的是在php中创建两种类型的图形:饼图,线性图形和彼此表示的数据。

每个图表都应该有自己的设置表示形式,如:标签,文本。

在饼图中,需要将指标数显示为数字或百分比。

我已经开始对接口和抽象类进行防御:

interface IGraph {
  function percent();
  function percentGroup($type);
}

abstract class Graph implements IGraph {
  abstract function source();
  abstract function percent();
  abstract function percentGroup($type);
}

class GraphPie extends Graph {
  function source() {}
  function percent() {}
  function percentGroup($type) {}
}

我意识到应该是一个常见的抽象类Graph,自定义类应该是GraphPieGraphLinear

我的问题是为此任务创建类的完整结构。例如,我需要创建另一个类GraphModelClass来编写从db?

检索数据的方法

换句话说,我需要在按模式检索数据时构建功能,并且可以在任何图形中表示。

我试图在我的案例中采用模式。我已经审查了模式,如:工厂,门面,但它不适合我。

关于使用模式我遵循这个简短的instruction

2 个答案:

答案 0 :(得分:2)

一般来说,如果您的代码依赖于您或其他人编写的其他代码的不同实现,则只需要interface。如果您要为多个数据模型实现单个视图,则可以使用interface。然后,视图可以以接口的形式访问具有合同的模型。

但在您的情况下,您希望以相反的方式执行此操作:对于具有百分比和组名称的聚合数据使用单个模型,对于相同类型的数据使用多个视图(折线图,饼图)。 / p>

您不需要使用对象继承。创建模型以检索和存储数据库中的数据。然后在绘制折线图或饼图的每个视图类中使用相同的模型。

如果您的类名为GraphLineGraphPie,则可以使用单一继承:

class GraphBase { /* generic draw functions, like labels */ }
class GraphLine extends GraphBase { /* Line graph specific drawing */ }
class GraphPie extends GraphBase { /* Pie chart specific drawing */ }

对于数据,您可以像这样创建一个类DataModel

class DataModel {
  protected $iYear;
  public function setYear(int $iYear) : self {}
  public function getGraphData() : array { /* SQL SELECT .. GROUP BY .. */ }
}

然后在GraphBase

class GraphBase {
  protected $oDataModel;
  public function setDataModel(DataModel $oDataModel) : self {
    $this->oDataModel = $oDataModel;
    return $this;
  }
  abstract function draw();  // GraphPie and GraphLine should implement this
}

用法:

$Model = new DataModel;
$Model->setYear(2017);
$LineGraph = new GraphLine;
$LineGraph
  ->setDataModel($Model)
  ->draw();

答案 1 :(得分:0)

由于您不打算在商业环境中使用它,因此您可能需要考虑使用现成的库,例如JpGraph 使用任何第三方库时,请务必检查如果图书馆的商业用途需要支付许可证,则需要获得许可