【问题标题】:Objects within objects in PHP?PHP中的对象内的对象?
【发布时间】:2014-11-25 21:36:06
【问题描述】:

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

希望下面的例子能更好地解释它:

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 );
    }
}

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

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 );
    }
}

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

我希望我已经以您可以理解的方式解释了这一点。

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

【问题讨论】:

  • 我的建议是使对象尽可能自然。还考虑使用任何框架,如 ex zf2
  • “更自然”到底是什么意思?你能根据我举的例子举个例子吗?
  • 将类视为名词,将对象视为它们的具体版本。例如想代表狗?创建一个Dog 类,并将所有必需的属性作为成员。想代表 Max 邻居的总督? new Dog('Max');

标签: php arrays class oop object


【解决方案1】:

考虑使用接口,接口是实现类必须遵守的契约。

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 功能强大的皮毛,但希望这将为您指明正确的方向。

【讨论】:

    猜你喜欢
    • 2011-11-02
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多