Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中对象中的对象?_Php_Arrays_Class_Oop_Object - Fatal编程技术网

PHP中对象中的对象?

PHP中对象中的对象?,php,arrays,class,oop,object,Php,Arrays,Class,Oop,Object,我对PHP中的OOP相当陌生,我想了解以下案例的最佳实践: 比如说,我开了一家商店,卖各种各样的东西,比如书、电影和餐盘。这些不同的产品类型各有不同的属性(餐盘有颜色和材质,书籍有作者,电影有演员和导演)。我可以为我销售的每种类型的产品创建一个类,但是当我还想销售猫时,我需要重新编码。相反,我可以创建一个类“product”,它具有所有产品都具有的一些属性(例如名称、价格、条形码)。现在,存储producttype特定属性、其他类“producttype”的实例或product中的简单数组的最佳

我对PHP中的OOP相当陌生,我想了解以下案例的最佳实践: 比如说,我开了一家商店,卖各种各样的东西,比如书、电影和餐盘。这些不同的产品类型各有不同的属性(餐盘有颜色和材质,书籍有作者,电影有演员和导演)。我可以为我销售的每种类型的产品创建一个类,但是当我还想销售猫时,我需要重新编码。相反,我可以创建一个类“product”,它具有所有产品都具有的一些属性(例如名称、价格、条形码)。现在,存储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 );
    }
}
在上面的示例中,还可以轻松存储(例如)不同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 );
    }
}
我认为最后一个选项破坏了对象的用途,但我不确定。我已经研究了扩展product类的可能性,但是我仍然需要每个productType有一个特定的类。如果我忽略了其他选择,请告诉我

我希望我已经用你能理解的方式解释了这一点


编辑:我现在发现我问的问题不是很清楚,事实上,我问错了问题。因此,我提出了一个新问题:

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

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

class Cat implements Product{
//must implement getName and getPrice
}
现在,在您的集成代码中,当您想要确保您的对象确实是有效的产品时,您可以使用类型提示以及实例检查:

public function addToCart(Product $product){}
上述方法将接受实现产品的任何类型的对象,因此保证实现关键的getName和getPrice方法

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

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

我们只是初步了解PHP OOP功能的强大功能,但希望这将为您指明正确的方向。

我的建议是尽可能使对象更自然。还考虑使用诸如ex ZF2之类的框架“更自然”到底意味着什么?你能根据我给出的例子给出一个例子吗?把类想象成名词,把对象想象成这些名词的具体版本。例如,你想代表狗吗?创建一个
Dog
类,将所有必需的属性作为成员。想代表邻居的狗Max吗<代码>新狗(“最大”)