PHP中对象内的对象?

时间:2014-11-25 21:36:07

标签: php arrays class oop object

我对PHP中的OOP相当新,我想对以下案例的最佳做法提出一些建议: 比如说,我拥有一家销售不同类型商品的商店,例如。书籍,电影和餐盘。这些不同的产品类型各有不同的属性(餐盘有颜色和材料,书籍有作者,电影有演员和导演)。我可以为我销售的每种类型的产品创建一个类,但是当我还想卖猫时我需要重新编码。相反,我可以创建一个类“产品”,它具有所有产品具有的一些属性(例如,名称,价格,条形码)。现在,存储产品类型特定属性的最佳方法是什么,其他类“producttype”的实例或只是产品中的简单数组?

以下示例希望能更好地解释它:

class product {
    private $s_name;
    private $i_price;
    private $s_barcode;
    private $o_properties;

    function __construct ( $name, $productType ) {
        $this->s_name = $name;
        $this->i_price = getPriceFromDb ( $name );
        $this->s_barcode = getBarcodeFromDb ( $name );
        $this->o_properties = new productType ( $this->s_name, $productType )
    }
}

class productType {
    private $a_propertieValues;
    private $a_datatypes;
    private $a_requiredFields;

    function __construct ( $name, $productType ) {
        $this->a_datatypes = getDatatypesFromDb ( $productType );
        $this->a_propertieValues = getPropertieValuesFromDb ( $name );
        $this->a_requiredFields = getRequiredFieldsFromDb ( $productType );
    }
}

在上面的示例中,还可以轻松存储(例如)不同productTypes具有的不同属性的数据类型和必填字段。另一种方法是简单地使用一个数组(见下文),但是你需要将数据类型存储在另一个数组中,否则你的数组将变得非常大,你总是返回整个数组。

class product {
    private $s_name;
    private $i_price;
    private $s_barcode;
    private $a_properties;

    function __construct ( $name, $productType ) {
        $this->s_name = $name;
        $this->i_price = getPriceFromDb ( $name );
        $this->s_barcode = getBarcodeFromDb ( $name );
        $this->a_properties = getOtherPropertiesFromDb ( $productType, $name );
    }
}

我认为这最后一个选项破坏了对象的目的,但我不确定。我已经研究了扩展类产品的可能性,但是我仍然需要每个productType的特定类。如果我还有其他选择,请告诉我。

我希望我能以你能理解的方式解释这一点。

编辑:我现在看到我没有非常清楚地问我的问题,事实上,我问了一个错误的问题。我因此问了一个新问题:https://stackoverflow.com/questions/27138816/

1 个答案:

答案 0 :(得分:1)

考虑使用Interfaces,接口是实现类必须遵守的合同。

Interface Product{
public function getName();
public function getPrice();
}

class Cat implements Product{
//must implement getName and getPrice
}

现在在您的集成代码中,当您想要确保对象确实是有效的产品时,您可以使用TypeHinting以及实例检查:

public function addToCart(Product $product){}

上面的方法将接受任何类型的实现Product的对象,因此保证实现关键的getName和getPrice方法。

如果您想查看您正在处理的产品类型:

if($product instanceof Cat){//this is a Cat product !}

我们实际上只是抓住了PHP OOP功能的强大功能,但希望这会给你一个指向正确方向的指针。