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