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,我的目的是在php中创建两种类型的图形:饼图、线性图形和相互表示数据 每个图形都应该有自己的设置表示,如:标签、文本 需要在饼图中以数字或百分比的形式显示指示器的数量 我从接口和抽象类的防御开始: interface IGraph { function percent(); function percentGroup($type); } abstract class Graph implements IGraph { abstract function source(); ab

我的目的是在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
,以及自定义类
GraphPie
GraphLinear

我的问题是为这个任务创建整个类结构。例如,我需要创建另一个类作为
GraphModelClass
where来编写从数据库检索数据的方法吗

换句话说,当我通过模式检索数据时,我需要构建功能,并且可以在任何图形中表示这一点

我试图在我的案例中采用模式。我已经回顾了一些模式,比如:工厂模式、门面模式,但它们并不适合我


我对使用模式进行了简短的说明:

< P>因为你不打算在商业环境中使用它,那么你可能需要考虑使用现成的库,例如在使用任何第三方库时<强>。如果图书馆的商业使用需要付费许可证,请务必检查许可证。一般来说,如果您的代码将依赖于您或其他人编写的其他代码的不同实现,您只需要一个
接口。如果要为多个数据模型实现单个视图,可以使用
接口。然后视图可以访问以接口形式具有契约的模型

但在您的案例中,您希望以另一种方式进行操作:使用单个模型对具有百分比和组名的聚合数据进行处理,对相同类型的数据使用多个视图(折线图、饼图)

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

如果您的类命名为
GraphLine
GraphPie
,则可以使用如下单继承:

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 .. */ }
}
然后在
图形数据库中

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();

这将用于商业或非商业网站?这是出于我自己的目的,我知道它通常有助于创建第一个变体,它可以完成您认为需要处理的100%的工作。然后稍作休息,从整体上回顾工作。然后决定第二次如何实现它,从头开始编写。然后再次暂停,然后根据前两次的经验编写第三个实现。通常,第三个实现为您的案例回答了这些问题。或者,你也可以先研究两三个现有的项目,阅读它们的源代码和文档,而不是编写自己的代码。或者两者兼而有之。不要从抽象开始。首先写具体的代码,然后在需要时添加抽象。@Karabah我同意你的观点。抽象很难掌握,你需要根据经验知道何时使用哪一种。我已经为您发布了一个答案,它将为您指明正确的方向。我试图学习自己如何使用OOP,因此我不想使用现成的解决方案o,class DataModel在哪里?可以创建
DataModel
并通过将数据放入具体的
GraphClass
中来填充此对象?或者直接在
GraphBase
中检索数据?假设在
GraphBase
类中有方法:
getData()
。这是可以的,但是如果将来我想按条件获取数据,比如:
getData($where)
?条件不会改变输出,它仍然是带有百分比的组名。要添加条件,您可以在
DataModel
上添加额外的属性,并使
getData()
使用它们。由于模型是在视图之外控制的,视图不会知道差异。您的意思是在
DataModel
类中创建一个新方法吗?因此,我可以在
GraphBase
中添加常用方法,如下所示:
draw()