我对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/
答案 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功能的强大功能,但希望这会给你一个指向正确方向的指针。