Php OOP类和外部数据列表

Php OOP类和外部数据列表,php,oop,mapping,Php,Oop,Mapping,在用PHP编程OO时,我从来不知道如何将类映射到简单的数据列表。我将试着做一个我每天都会遇到的简单例子: 首先,MySQL表创建: /* create product table */ CREATE TABLE `product` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL, `description` text COLLATE utf8_unico

在用PHP编程OO时,我从来不知道如何将类映射到简单的数据列表。我将试着做一个我每天都会遇到的简单例子:

首先,MySQL表创建:

/* create product table */
CREATE TABLE `product` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `description` text COLLATE utf8_unicode_ci,
 `price` decimal(10,0) NOT NULL,
 `brand` int(11) NOT NULL,
 `deliverytime` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

/* data list for all kind of brands */
CREATE TABLE `brand` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `brand` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

/* brand data*/
insert  into `brand`(`id`,`brand`) values (1,'nike'),(2,'adidas'),(3,'diesel'),  (4,'dkny'),(5,'lacoste');

/* data list for deliverytime */
CREATE TABLE `deliverytime` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `deliverytime` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

/* deliverytime data */
insert  into `deliverytime`(`id`,`deliverytime`) values (1,'1 day'),(2,'2 days'),(3,'3 days'),(4,'4 days'),(5,'5 days'),(6,'6 days'),(7,'1 week'),(8,'1 - 2 weeks'),(9,'2 - 3 weeks'),(10,'4 - 5 weeks');
然后创建产品类

  class Product{
    private 
    $name,
    $description,
    $price,
    $brand
    $deliverytime;

    public function __construct(){
       // etc etc
    }

    public function save(){
       // save the product
    }
   }
现在的大问题是:

在我的产品类别中,我应该如何处理$brand和$deliverytime? 我是否应该创建一个Brand和DeliveryTime对象(它反过来负责获取正确的Brand和/或DeliveryTime数据)

那么保存产品对象呢? 我应该如何处理品牌和交货时间数据

处理这种情况的最佳实践或模式是什么

很抱歉提出这个问题,但我不确定在哪里查找(要搜索的标签):/

编辑:


好吧,让我们假设我不想使用某种ORM框架(条令、宿舍、红豆等),因为这对我的小系统来说是一个巨大的杀伤力+我真的很想知道如何创建映射自己的学习目的。。。有什么建议吗?

这是我喜欢的风格

class ProductModel {
    public function find($id) {
         // fetch product with your database code using parameters to filter

         $product = new ProductEntity(
             // initialize with non foreighn values (eg. $row->id, $row->name)
             new ProductBrandEntity($row->brand_id, $row->brand_name); // available because you joined brand??
             new ProductDeliveryTime(/* initialize */)
         );

         return $product;
    }
}

我喜欢从数据库实体调用对象,但您可以随意调用它们。。这基本上是您在问题中建议的,但我更喜欢使用模型(来自MVC)来初始化实体,而不是实体本身。您应该对ORMs和ActiveRecord进行一些研究,因为这项工作基本上已经为您完成了

这是我喜欢的风格

class ProductModel {
    public function find($id) {
         // fetch product with your database code using parameters to filter

         $product = new ProductEntity(
             // initialize with non foreighn values (eg. $row->id, $row->name)
             new ProductBrandEntity($row->brand_id, $row->brand_name); // available because you joined brand??
             new ProductDeliveryTime(/* initialize */)
         );

         return $product;
    }
}

我喜欢从数据库实体调用对象,但您可以随意调用它们。。这基本上是您在问题中建议的,但我更喜欢使用模型(来自MVC)来初始化实体,而不是实体本身。您应该对ORMs和ActiveRecord进行一些研究,因为这项工作基本上已经为您完成了

请看一下用于处理CRUD操作的存储库模式。您还可以看一下条令。它抽象了对象关系中的数据库交互;)请看一下用于处理CRUD操作的存储库模式。您还可以看一下条令。它抽象了对象关系中的数据库交互;)让模型初始化(实例化)db实体而不让实体自己初始化,到底有什么好处?是不是因为模型就像工厂一样?很抱歉反应太慢了。是的,它是一种工厂。在理想情况下,对于不同的来源,您可以使用不同的模型。在我的例子中,我有一个internet流的实体,称为StreamEntity,它可以从StreamApiModel或StreamPdoModelBtw-TFennis检索,我一直在寻找activerecord。Activerecord确实是我试图创建的东西,但似乎没有一个好的教程来描述如何在Activerecord对象中实现1:N或N:M关系(关联)。你知道什么好的图坦卡门或文章吗?我访问了www.phpactiverecord.org,但我认为完全理解这些代码有点困难:有一个模型初始化(实例化)db实体,而没有实体本身初始化,这到底有什么好处?是不是因为模型就像工厂一样?很抱歉反应太慢了。是的,它是一种工厂。在理想情况下,对于不同的来源,您可以使用不同的模型。在我的例子中,我有一个internet流的实体,称为StreamEntity,它可以从StreamApiModel或StreamPdoModelBtw-TFennis检索,我一直在寻找activerecord。Activerecord确实是我试图创建的东西,但似乎没有一个好的教程来描述如何在Activerecord对象中实现1:N或N:M关系(关联)。你知道什么好的图坦卡门或文章吗?我访问了www.phpactiverecord.org,但我认为要完全理解其中的代码有点困难:O