php oo - 怎么做对了?

时间:2011-11-21 10:14:18

标签: php oop

我第一次使用OO创建了一个网站,我正在努力寻找正确的方法。 我不喜欢在一个类中完成所有操作的类,因此我将实体和数据库类分开。 例如:http://w3cyberlearning.com/php/mysql_oop_product_class.php 我发现这个课程不那么合乎逻辑。 - 为什么产品应该包含数据库实例 - $ product-> get_products()根本不合逻辑。

所以我根据以下结构创建了一个单独的类:

Table: Products
Fields: productID,productName,categoryID

Table: ProductCategory
Fields: categoryID,category

Classes:
Product
-productID
-productName
-category (object)

DataProduct
-insertProduct($product)
    insert query...
-deleteProduct($product)
    delete query...
-getProduct($id)
    select data from table ... (join between product and category to get all the fields)
    $category = new Category($categoryID,$categoryname)
    $product = new Product($productID,$productName);
    $product->setCategory($category);
    return $product;

ProductCategory
-categoryID
-category

DataProductCategory
...

但现在我遇到了一些问题,我正在处理它。

问题1

例如,删除产品,我可以执行两个不同的脚本,我应该使用哪个?

http://www.mywebsite.com/books/1/
$id = 1 (1 retrieved from the url)
$DataProduct = new DataProduct();
$DataProduct->deleteProduct($id);
OR
$product = new Product();
$product->setId($id);
$DataProduct = new DataProduct();
$DataProduct->deleteProduct($product);

问题2

当我从数据库中检索产品时,我创建了一个新的产品对象,并将该类别作为对象添加到产品中。 假设您有一个管理页面,您想要添加新产品,并且您有一个包含类别ID的选项列表:

<input type="text" name="productname">
<select name="categories">
<option name="cat1" value="1">
<option name="cat2" value="2">
</select>

如果我想将此产品保存到数据库中,最好的方法是什么? 在数据库中,productstable仅保存categoryID offcourse,作为categorytable的外键。

$product = new Product();
$product->setProductName("test");
$product->setCategoryID(1); (and add a variable categoryID in the products class)
$dataProduct = new DataProduct();
$dataProduct->insertProduct($product);

只需获取$ product-&gt; categoryID并将其与$ product-&gt; productName一起插入数据库

或者我应该这样做:

$product = new Product();
$product->setProductName("test");
$dataCategory = new DataCategory();
$dataProduct = new DataProduct();
$category = $dataCategory->getCategory(); (which retrieves the categoryID and name, creates the object and returns it)
$product->setCategory($category);
$dataProduct->insertProduct($product);

并保存从对象中检索类别的ID?

这两种方式都可行,但我有点卡在哪个方向。

1 个答案:

答案 0 :(得分:0)

问题1

我建议使用DataProduct方法。尽管它与Product更相关,但您已经使用DataProduct进行插入和更新等类似操作。我要说你也需要坚持使用同一个对象进行删除。

问题2

即使我的感觉说你应该坚持第一种方法,因为它更整洁,第二种方法是OOP正确的。您只是为Product类设置了属性,因此如果您的Category类中的ID获得了Product对象,那就太麻烦了。相反,您想要设置整个对象。


OOP是一个困难的理论问题,但你做得很好。我知道判断你自己的OOP是非常困难的,因为你经常从编程的角度来看待它,而不是OOP的观点,这使得它比现在更难。