Php 一个抽象类,然后使用数据库中的属性创建继承该类的对象

Php 一个抽象类,然后使用数据库中的属性创建继承该类的对象,php,database,class,inheritance,abstract-class,Php,Database,Class,Inheritance,Abstract Class,我目前正在考虑创建一个抽象类Building。然后,我希望多个不同类型的建筑使用数据库中的属性继承这个摘要 对于继承,我通常会有如下内容: abstract class Building { protected $id, $name, $cost; public function getName() { // return name } } class CoffeeShop inherits Building { pro

我目前正在考虑创建一个抽象类
Building
。然后,我希望多个不同类型的
建筑
使用数据库中的属性继承这个摘要

对于继承,我通常会有如下内容:

abstract class Building {
    protected
        $id,
        $name,
        $cost;

    public function getName() { // return name }

}
class CoffeeShop inherits Building {
    protected $id = 2, $name = 'Coffee Shop', $cost = '£15';
    public function sellCoffee() { // sell it }
}
class ConferenceCentre inherits Building {
    protected $id = 2, $name = 'Conference Centre', $cost = '£10';
    public function bookRoom() { // book it } 
}
abstract class Building { // blah }

// Loop through DB to create objects that inherit the building class (factory?)
$building = new BuildingFactory('CoffeeShop');

// Random function that hints of the type (despite class file not existing)
public function (CoffeeShop $cs) { // Do stuff }

// Random test of type
if (gettype($building) == 'CoffeeShop') { // Do stuff }
Pretty standard是一个标准的blueprint构建类,它定义了其他人应该继承和声明的内容。 假设有超过100种不同的建筑类型。。。其中一些是相当标准的,但它们的所有属性都在
数据库中定义,允许管理员进入并更改其
名称、成本、要求等,其中一些可能不需要定义任何特殊功能,但如果将来需要,定义该功能将非常酷

是否可以进入数据库并使用对象的属性和类型填充/创建对象,而不必首先定义实际的文件?如果我真的要创建这个文件,那么它是手工操作的,我被绑定到文件系统,而不是数据库中存储的实际建筑物

然后我可以做一些类似的事情:

abstract class Building {
    protected
        $id,
        $name,
        $cost;

    public function getName() { // return name }

}
class CoffeeShop inherits Building {
    protected $id = 2, $name = 'Coffee Shop', $cost = '£15';
    public function sellCoffee() { // sell it }
}
class ConferenceCentre inherits Building {
    protected $id = 2, $name = 'Conference Centre', $cost = '£10';
    public function bookRoom() { // book it } 
}
abstract class Building { // blah }

// Loop through DB to create objects that inherit the building class (factory?)
$building = new BuildingFactory('CoffeeShop');

// Random function that hints of the type (despite class file not existing)
public function (CoffeeShop $cs) { // Do stuff }

// Random test of type
if (gettype($building) == 'CoffeeShop') { // Do stuff }
我想问题是。。。是否有任何方法可以创建类而不必创建实际的文件。我猜,它能够检查该文件是否确实存在,并在需要时添加自定义函数

否则,我将不得不创建100多个文件,让工厂把它们拉出来并填写


谢谢,Dominic

如果不编写定义,就无法定义类。对于任何计算机语言都是如此,对于PHP也是如此

但是,您可以将代码放入数据库中,或者根据从数据库获取的数据生成代码

但是,每当您接近
eval
(这将用于这些)时,最有价值的是在创建设计时,查看您是否提出了正确的问题

在我看来,您一直都有相同的对象,但它只有一些不同的数据


我不确定这些对象必须具有多少不同的功能。关于应用程序的一般结构和底层域逻辑,您没有分享太多信息,因此很难在第一个答案中进行说明。

如果不编写定义,就无法定义类。对于任何计算机语言都是如此,对于PHP也是如此

但是,您可以将代码放入数据库中,或者根据从数据库获取的数据生成代码

但是,每当您接近
eval
(这将用于这些)时,最有价值的是在创建设计时,查看您是否提出了正确的问题

在我看来,您一直都有相同的对象,但它只有一些不同的数据


我不确定这些对象必须具有多少不同的功能。关于应用程序的一般结构和底层域逻辑,您没有分享太多信息,因此很难在第一个答案中给出答案。

好的,谢谢。。。只要看一看Zandstra的PHP OOP书,他似乎就有一个定义类的列表,比如类Sea{}类Plains{}类EarthPlains Extendes Plains{}等。所以我想,如果您需要添加其他方法,并且没有办法获得该文件,它们就会出现。调用对象后,工厂会潜入数据库并获取属性。。。谢谢:)这些例子在面向对象的书中给出了简化的例子。相反,我建议您在开始OOP编程之前先学习OOAD。这很有帮助。嗯,仔细想想,我不认为我真的需要把所有这些建筑都定义为空的物体。我想如果我要创建一个工厂对象,克隆一个原始建筑对象并用属性填充它,而不是使用
if-typeof($class)=='CoffeeShop'
如果$class->name='CoffeeShop'
我可以改为使用
if$class->name='CoffeeShop'
然后添加类,如果工厂需要任何额外的独特功能,则在需要时克隆其中一个作为例外。我仍然需要读完这本书:尽管如此,使用名称填充对象将是非常低效的。最好为每个建筑都有一个ID映射,所以每个建筑都有一个类,在创建数据时只指定用于拉入数据的ID,这可能是一个好主意。某种类型的ID通常非常有用。它表示一个类中的每个数据库记录。ID在这里起着中心作用,因为它将对象映射到(关系)数据库中的特定行。。。只要看一看Zandstra的PHP OOP书,他似乎就有一个定义类的列表,比如类Sea{}类Plains{}类EarthPlains Extendes Plains{}等。所以我想,如果您需要添加其他方法,并且没有办法获得该文件,它们就会出现。调用对象后,工厂会潜入数据库并获取属性。。。谢谢:)这些例子在面向对象的书中给出了简化的例子。相反,我建议您在开始OOP编程之前先学习OOAD。这很有帮助。嗯,仔细想想,我不认为我真的需要把所有这些建筑都定义为空的物体。我想如果我要创建一个工厂对象,克隆一个原始建筑对象并用属性填充它,而不是使用
if-typeof($class)=='CoffeeShop'
如果$class->name='CoffeeShop'
我可以改为使用
if$class->name='CoffeeShop'
然后添加类,如果工厂需要任何额外的独特功能,则在需要时克隆其中一个作为例外。我仍然需要读完这本书:尽管如此,使用名称填充对象将是非常低效的。最好有一个每个建筑的ID地图,所以可能是